ПОМИЛКА 1452: Неможливо додати або оновити дочірній рядок: помилка зовнішнього ключа не вдається


132

Я створив таблиці в MySQL Workbench, як показано нижче:

ЗАМОВИТИ таблицю:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

PRODUKT таблиця:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

та таблиця ORDRELINJE:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

тому коли я намагаюся вставити значення в ORDRELINJEтаблицю, я отримую:

Код помилки: 1452. Неможливо додати або оновити дочірню рядок: помилка зовнішнього ключа виходить з ладу ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

Я бачив інші публікації на цю тему, але не пощастило. Я курирую щось чи якусь ідею, що робити?


Відповіді:


172

Взяті з використання обмежень зовнішніх ключів

Іноземні ключові зв'язки включають батьківську таблицю, яка містить центральні значення даних, і дочірню таблицю з однаковими значеннями, що вказують на її батьківську. Запропонований пункт FOREIGN KEY вказаний у дочірній таблиці.

Він буде відхиляти будь-яку операцію INSERT або UPDATE, яка намагається створити значення стороннього ключа в дочірній таблиці, якщо в батьківській таблиці немає значення відповідного ключа-кандидата.

Отже, Error Code: 1452. Cannot add or update a child row: a foreign key constraint failsпо суті, ваша помилка означає, що ви намагаєтеся додати рядок до Ordrelinjeтаблиці, для якої у таблиці немає відповідного рядка (OrderID) Ordre.

Спочатку слід вставити рядок у свою Ordreтаблицю.


Або ми можемо скинути іноземний ключ, а потім додати іноземний ключ після вставки даних?
Вамсі Паван Махеш

@VamsiPavanMahesh, НІ, викликай, навіть якщо ти це зробиш; ваше попереднє створення ключа не вдасться з такою ж помилкою, оскільки буде невідповідність ключових даних.
Рахул

4
Якщо у дітей визначені ідентифікатори батьків, ці батьки повинні існувати. І я подумав, що мій синтаксис був неправильним ... Це мені дуже допомогло. Дякую!
1616

2
А як щодо факультативних відносин?
Хамед Хамеді

40

Ви отримуєте цю перевірку обмежень, оскільки Ordreтаблиця не містить посилання OrdreIDв команді insert.

Щоб вставити значення в Ordrelinje, спочатку потрібно ввести значення в Ordreтаблицю і використовувати те саме OrdreIDв Orderlinjeтаблиці.

Або ви можете видалити ненулеве обмеження і вставити в нього значення NULL.


29

Ви повинні видалити дані в дочірній таблиці, яка не має жодного відповідного значення іноземного ключа до первинного ключа батьківської таблиці. Або видалити всі дані з дочірньої таблиці, а потім вставити нові дані, що мають те саме значення зовнішнього ключа, як і первинний ключ у батьківській таблиці . Це має спрацювати. Ось також відео на YouTube


1
Це правильно, перед тим як вставляти дані у зведену таблицю (та, яка має обмеження CASCADE), ви повинні вставити дані у батьківські таблиці. наприклад, перша таблиця - дозволи; 2-а таблиця - ролі; 3-а таблиця - дозвіл_роля; Отже, 1-а вставка в таблицю дозволів, друга вставка в таблицю ролей і нарешті вставка в таблицю дозволів_role
Діпак Панвар

24

Проблема полягає у обмеженні зовнішнього ключа. За замовчуванням (SET FOREIGN_KEY_CHECKS = 1). Параметр FOREIGN_KEY_CHECKS визначає, чи слід перевіряти обмеження зовнішнього ключа для таблиць InnoDB чи ні. MySQL - SET FOREIGN_KEY_CHECKS

Ми можемо встановити перевірку зовнішнього ключа як відключену перед запуском Запиту. Вимкнути зовнішній ключ .

Виконайте один із цих рядків перед запуском запиту, тоді ви зможете запустити запит успішно. :)

1) Для сесії (рекомендується)

SET FOREIGN_KEY_CHECKS=0;

2) у всьому світі

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

Ця помилка, як правило, виникає через те, що у посилальному полі дочірньої таблиці у нас є деякі значення , яких не існує у полі посилання / кандидата батьківської таблиці.

Іноді ми можемо отримати цю помилку, коли застосуємо обмеження іноземного ключа до існуючих таблиць, вже маючи в них дані . Деякі з інших відповідей пропонують повністю видалити дані з дочірньої таблиці, а потім застосувати обмеження. Однак це не варіант, коли ми вже маємо робочі / виробничі дані в дочірній таблиці. У більшості сценаріїв нам потрібно буде оновити дані в дочірній таблиці (замість їх видалення).

Тепер ми можемо використовувати Left Joinдля пошуку всіх тих рядків у дочірній таблиці, у яких немає батьківських таблиць. Наступний запит буде корисним для отримання цих невідповідних рядків:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

Тепер, як правило, можна виконати один (або більше) наступних кроків для виправлення даних.

  1. Виходячи з вашої "бізнес-логіки", вам потрібно буде оновити / співставити ці невідповідні значення (ів) з наявними значеннями в батьківській таблиці. Можливо, вам іноді знадобиться встановити їх nullтакож.
  2. Видаліть ці рядки, що мають незрівнянні значення.
  3. Додайте у свою батьківську таблицю нові рядки, що відповідають невідмінним значенням у дочірній таблиці.

Після фіксації даних ми можемо застосувати обмеження іноземного ключа за допомогою ALTER TABLEсинтаксису.


Я видаляю всі дані з таблиці, а потім додаю зовнішній ключ, додано дякую
Суміт Кумар Гупта

4

у таблиці іноземних ключів є значення, яке не належить до таблиці первинного ключа, яке буде пов'язане, тому ви повинні спочатку видалити всі дані / відрегулювати значення таблиці зовнішнього ключа відповідно до значення, яке знаходиться у вашому первинному ключі


3

Я отримував це питання, навіть якщо моя батьківська таблиця мала всі значення, на які я посилалась у своїй дитячій таблиці. Проблема, здавалося, полягала в тому, що я не міг додати декілька посилань на дитину до жодного іноземного ключа. Іншими словами, якщо у мене було п'ять рядків даних, на які посилався той самий зовнішній ключ, MySQL дозволяв мені лише завантажувати перший рядок і давав мені помилку 1452.

Що працювало для мене, було введення коду "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Після цього я закрив MySQL, а потім перезапустив його, і я зміг завантажувати всі свої дані без помилок. Потім я набрав "SET GLOBAL FOREIGN_KEY_CHECKS = 1", щоб повернути систему в норму, хоча я не зовсім впевнений, що робить FOREIGN_KEY_CHECKS. Сподіваюся, це допомагає!


Це не лише те, що вже було запропоновано у відповіді, опублікованій @ Mr-Faizan? Якщо ні, то поясніть, що додає ваша відповідь.
Адріан Моль

2

Це можна виправити, спочатку вставивши відповідні записи у батьківську таблицю, а потім ми зможемо вставити записи у відповідний стовпець таблиці таблиці. Також перевірте тип даних та розмір стовпця. Вона повинна бути такою ж, як і у стовпчику батьківської таблиці, навіть двигун та порівняння також повинні бути однаковими. СПРОБУЙТЕ ЦЕ! Ось як я вирішив своє. Виправте мене, якщо я помиляюся.


1

Ваша ORDRELINJEтаблиця пов'язана з ORDERтаблицею, використовуючи обмеження іноземного ключа, constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)згідно з яким Ordre int NOT NULL,стовпець таблиці ORDRELINJEповинен відповідати будь-якому Ordre int NOT NULL,стовпцю ORDERтаблиці.

Тепер те, що відбувається тут, коли ви вставляєте новий рядок у ORDRELINJEтаблицю, згідно з обмеженням fk, Ordrelinje_fkце контрольна ORDERтаблиця, чи OrdreIDє присутність чи ні, і оскільки вона не відповідає жодному OrderId, компілятор скаржиться на порушення зовнішнього ключа. З цієї причини ви отримуєте цю помилку.

Зовнішній ключ - це первинний ключ іншої таблиці, який ви використовуєте в будь-якій таблиці для зв'язку між обома. Цей ключ пов'язаний з обмеженням зовнішнього ключа, яке ви вказуєте під час створення таблиці. Будь-яка операція з даними не повинна порушувати це обмеження. Порушення цього обмеження може призвести до подібних помилок.

Сподіваюся, я зрозумів це.


1

Під час вставлення значень атрибутів іноземного ключа спочатку перевірте тип атрибутів, а також значення атрибута первинного ключа у батьківському відношенні, якщо значення у батьківському відношенні збігаються, то ви можете легко вставити / оновити дочірні значення атрибутів.


1

Ви повинні додати дані з КОНТРОЛЬНОГО КОНТРОЛЯ в ПЕРВИЧНІЙ ТАБЛИЦІ до ІНОЗЕМНОГО КЛЮЧУ ДІТЕЙНОЇ ТАБЛИЦІ,
це означає, що не додавати випадкові дані до іноземного ключа ، просто використовувати дані з первинного ключа, який є доступним

опис даних в іноземному ключі


1

Це допомогло мені прочитати відповіді @ Mr-Faizan та інші відповіді.

Зніміть прапорець "Увімкнути перевірку зовнішнього ключа"

в phpMyAdmin та натисніть на запит. Я не знаю про WorkBench, але інші відповіді можуть вам допомогти.


0

ви повинні вставити принаймні один необроблений у кожну таблиці (ті, на які ви хочете вказувати зовнішні ключі), тоді ви можете вставити або оновити значення зовнішніх ключів


0

я погано стискаю це: тут мій випадок намагався створити подобу посади, котра існує; під час вчинення бази даних помилка була піднята. рішення було спочатку створити публікацію, а потім сподобатися. з мого розуміння, якщо post_id потрібно було зберегти в таблиці подобань, спочатку потрібно перевірити таблицю повідомлень, щоб з’ясувати існування. я вважав, що краще мати це таким чином, оскільки це більш логічно для мене таким чином ..


0

Коли ви використовуєте іноземний ключ , ваш порядок стовпців повинен бути однаковим для вставки .

Наприклад, якщо ви додаєте (userid, password)в table1 з table2 потім з table2 порядку повинні бути однаковими (userid, password)і НЕ так, як (password,userid) , де useridє зовнішній ключ в table2 з table1 .


0

Проблема виникає через те, що ви встановлюєте зовнішній ключ у дочірній таблиці після того, як ви вставили деякі дані в дочірню таблицю.

Спробуйте видалити всі дані з дочірньої таблиці, потім встановіть зовнішній ключ і після цього додайте / вставте дані в таблицю, вона спрацює.


0

перевірити ні. запис у батьківській таблиці, який відповідає дочірній таблиці, а також первинний ключ, повинен відповідати посиланням зовнішнього ключа. Це працює для мене.


-4

Його 100% працює ...

ПОМИЛКА 1452: Неможливо додати або оновити дочірню рядок: помилка зовнішнього ключа виходить з ладу .... якщо трапляється такий тип помилок: тоді насамперед перейдіть до цієї таблиці та перевірте в налаштуваннях> Якщо двигун: InnoDB, то змініть його на MyISAM

(і видалити посилання з іноземними обмеженнями)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.