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

таблица 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, и я не вижу, что не так.

Ответ 1

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

Ответ 2

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

Ответ 3

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

SET FOREIGN_KEY_CHECKS=0

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

SET FOREIGN_KEY_CHECKS=1

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

В Table1 Entity:

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

В Table2 Entity:

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

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

Ответ 17

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

Ответ 18

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

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

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

Ответ 19

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

например, Таблица2 имеет следующие данные:

UserID    PostID    Title    Summary
5         1         Lorem    Ipsum dolor sit

Таблица 1

UserID    Password    Username    Email
9         ********    JohnDoe     [email protected]

Если вы попытаетесь изменить таблицу 2 и добавить внешний ключ, запрос не будет выполнен, поскольку UserID = 5 не существует в таблице Table1.

Ответ 20

Сбой ограничения внешнего ключа дочерней таблицы

Эта проблема может возникнуть по следующей причине:

Если вы делаете это в Spring mvc, вам нужно явно описать тип id, потому что иногда mysql не может распознать тип id. таким образом, вы явно устанавливаете как в обеих таблицах в своем классе сущности @GeneratedValue (strategy = GenerationType.IDENTITY)