it-swarm-ru.tech

Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено

таблица 1

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| UserID   | int(11)     | NO   | PRI | NULL    | auto_increment |
| Password | varchar(20) | NO   |     |         |                |
| Username | varchar(25) | NO   |     |         |                |
| Email    | varchar(60) | NO   |     |         |                |
+----------+-------------+------+-----+---------+----------------+

таблица 2

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| UserID           | int(11)      | NO   | MUL |         |                |
| PostID           | int(11)      | NO   | PRI | NULL    | auto_increment |
| Title            | varchar(50)  | NO   |     |         |                |
| Summary          | varchar(500) | NO   |     |         |                |
+------------------+--------------+------+-----+---------+----------------+

Ошибка:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: 
Cannot add or update a child row: a foreign key constraint fails 
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`) 
REFERENCES `table1` (`UserID`)) 

Что я сделал не так? Я читаю http://www.w3schools.com/Sql/sql_foreignkey.asp и не вижу, что не так.

145
Tom

Вы получаете эту ошибку, потому что вы пытаетесь добавить/обновить строку в table2, которая не имеет допустимого значения для поля UserID на основе значений, которые в настоящее время хранятся в table1. Если вы разместите еще немного кода, я могу помочь вам диагностировать конкретную причину.

195
Brian Driscoll

Это означает, что вы пытаетесь вставить в table2 значение UserID, которого нет в table1.

112
Rami C

Простым взломом может быть отключение проверок внешнего ключа перед выполнением любой операции с таблицей. Просто запрос

SET FOREIGN_KEY_CHECKS=0

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

SET FOREIGN_KEY_CHECKS=1

Это работает для меня много раз.

81
Sandeep Giri

Я обнаружил еще один странный случай: если вы случайно создаете внешний ключ из таблицы InnoDB в таблицу MyISAM, MySQL выдает эту ошибку во время вставки, даже если в противном случае данные действительны.

Смотрите http://nick.zoic.org/art/mysql-foreign-key-error/

35
NickZoic

Вы получаете эту ошибку, потому что есть некоторое значение int table2.UserID, которого нет в table1.UserID (я полагаю, что вы установили значение table2.UserID вручную до того, как создали этот внешний ключ) .
Один пример для этой сцены: table1.UserID получает значения 1,2,3 и table2.UserID получает значения 4 (добавляется вручную). Поэтому, когда вы создаете внешний ключ, они не могут найти UserID = 4 из table1, и ошибка будет возникать .
Чтобы исправить эту ошибку, просто удалите UserID = 4 из table2 или вы можете очистить их оба, а затем создать внешний ключ и .
Удачи!

13
Justin

Если вы вставили строку в таблицу 1 до создания внешнего ключа в таблице 2, то вы получите ошибку ограничения внешнего ключа, поскольку значение автоматического увеличения равно 2 в таблице 1 и 1 в таблице 2. Чтобы решить эту проблему, необходимо выполнить следующие действия. обрежьте таблицу 1 и установите значение автоматического приращения обратно в 1. Затем вы можете добавить таблицу 2.

10
Attaque

У меня просто была такая же проблема, решение легко.

Вы пытаетесь добавить идентификатор в дочернюю таблицу, которая не существует в родительской таблице.

проверьте хорошо, потому что InnoDB имеет ошибку, которая иногда увеличивает столбец auto_increment без добавления значений, например, INSERT ... ON DUPLICATE KEY

6
Blaztix

У меня была похожая проблема. Вы пытаетесь применить внешний ключ к таблице, в которой есть содержимое, а столбец не имеет значения NULL. У вас есть два варианта.

  1. Сделайте столбец, к которому вы хотите применить ограничения внешнего ключа, обнуляемым. Таким образом, внешний ключ будет применяться, зная, что некоторые поля могут быть обнуляемыми. ( Это то, что я сделал. )
  2. Создайте столбец, к которому вы хотите применить ограничение внешнего ключа, напишите запрос, чтобы вставить внешний ключ в столбец, а затем примените ограничения внешнего ключа. ( Не пробовал, но это должно работать )
5
Jacob

Убедитесь, что вы установили ядро ​​базы данных InnoDB, потому что в MyISAM внешний ключ и транзакция не поддерживаются

4
Aman Maurya

Убедитесь, что значение, которое вы вставляете во внешний ключ, существует в родительской таблице. Это помогло мне. Например, если вы вставляете user_id = 2 в table.2, но table.1 не имеет user_id = 2, ограничение выдает ошибку. Мой был код ошибки # 1452, если быть точным. Надеюсь, что это поможет кому-то еще с той же проблемой!

2
Dustin Hammack

У меня была та же проблема, и причина была в том, что у меня была строка в первой таблице до добавления внешнего ключа.

2
Ouissal

Просто немного исправить: Сделайте JoinColumn 'nullable = true' в Таблице1 и поле 'UserID', вставьте = false 'и' nullable = true 'в Таблице2.

В таблице 1 сущность:  

@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;

В таблице 2 сущность:

@Column(insertable = false, nullable = true)
private int UserID;
1
Ujjwal Chaudhary

Еще один странный случай, который дал мне эту ошибку. Я ошибочно связал свои внешние ключи с первичным ключом id. Это было вызвано неправильными командами alter table. Я узнал об этом, запросив таблицу INFORMATION_SCHEMA (см. Этот ответ stackoverflow)

Таблица была настолько запутана, что не могла быть исправлена ​​никакими командами ALTER TABLE. Я наконец уронил стол и восстановил его. Это избавило от ошибки целостности.

0
Vicky T

Существуют ли какие-либо данные, содержащиеся в таблице? Если это так, попробуйте очистить все данные в таблице, в которую вы хотите добавить внешний ключ. Затем снова запустите код (добавьте внешний ключ).

Я сталкивался с этой проблемой очень много раз. Эта очистка всех данных в таблице работает, когда вы хотите добавить внешний ключ в существующую таблицу.

Надеюсь, это работает :)

0
Noldy

Возможно, когда вы добавили столбец userID, для этой определенной таблицы есть данные, которые будут установлены, поэтому по умолчанию будет иметь значение 0, попробуйте добавить столбец без NOT NULL 

0
WTFZane

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

0
Justin Jose

Я также получил эту ошибку: «Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется». Я получил ошибку при добавлении новой строки в родительскую таблицу

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

0
Nadir Latif

Если вы используете mysql индекс или связь между таблицами, сначала вы удаляете столбцы (например, city_id) и создаете новые столбцы с тем же именем (например, city_id). Затем повторите попытку ...

0
Mahmut Aydın