Таблица 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 и не вижу, что не так.
table2.UserID
, которого нет вtable1.UserID
.Ответы:
Вы получаете эту ошибку, потому что вы пытаетесь добавить / обновить строку
table2
, у которой нет действительного значения дляUserID
поля на основе значений, в настоящее время хранящихся вtable1
. Если вы отправите еще немного кода, я могу помочь вам диагностировать конкретную причину.источник
Это означает , что вы пытаетесь вставить
table2
вUserID
значение , которое не существует вtable1
.источник
Простым взломом может быть отключение проверок внешнего ключа перед выполнением любой операции с таблицей. Просто запрос
Это отключит сопоставление внешнего ключа с любыми другими таблицами. После того, как вы закончите с таблицей, включите его снова
Это работает для меня много раз.
источник
Я обнаружил еще один странный случай: если вы случайно создаете внешний ключ из таблицы InnoDB в таблицу MyISAM, MySQL выдает эту ошибку во время вставки, даже если в противном случае данные действительны.
Смотрите http://nick.zoic.org/art/mysql-foreign-key-error/
источник
Вы получаете эту ошибку, потому что есть некоторое значение int
table2.UserID
, которого не существуетtable1.UserID
(я полагаю, что вы установилиtable2.UserID
значение вручную до того, как создали этот внешний ключ).Один пример для этой сцены:
table1.UserID
получить значения 1,2,3 иtable2.UserID
получить значения 4 (добавить вручную). Поэтому , когда вы делаете внешний ключ, они не могут найтиUserID = 4
изtable1
и ошибка будет ocurse.Чтобы исправить эту ошибку, просто удалите
UserID = 4
изtable2
или вы можете очистить их обоих, а затем создать внешний ключ и.Удачи!
источник
Это заняло у меня некоторое время, чтобы понять. Проще говоря, таблица, которая ссылается на другую таблицу, уже содержит данные, и одно или несколько ее значений не существует в родительской таблице.
например, Таблица2 имеет следующие данные:
Таблица 1
Если вы попытаетесь изменить таблицу 2 и добавить внешний ключ, тогда запрос не будет выполнен, поскольку UserID = 5 не существует в таблице Table1.
источник
Если вы вставили строку в таблицу 1 до создания внешнего ключа в таблице 2, вы получите ошибку ограничения внешнего ключа, поскольку значение автоматического увеличения равно 2 в таблице 1 и 1 в таблице 2. Чтобы решить эту проблему, необходимо выполнить следующие действия. обрежьте таблицу 1 и установите значение автоматического приращения обратно в 1. Затем вы можете добавить таблицу 2.
источник
Убедитесь, что вы установили ядро базы данных InnoDB, потому что в MyISAM внешний ключ и транзакция не поддерживаются
источник
Немного исправлено: сделайте JoinColumn 'nullable = true' в Таблице 1 и поле 'UserID', вставьте = false 'и' nullable = true 'в Таблице 2.
В Table1 Entity:
В Table2 Entity:
источник
У меня просто была такая же проблема, решение легко.
Вы пытаетесь добавить идентификатор в дочернюю таблицу, который не существует в родительской таблице.
проверьте хорошо, потому что InnoDB имеет ошибку, которая иногда увеличивает столбец auto_increment без добавления значений, например,
INSERT ... ON DUPLICATE KEY
источник
У меня была похожая проблема. Вы пытаетесь применить внешний ключ к таблице, в которой есть содержимое, а столбец не имеет значения NULL. У вас есть два варианта.
источник
Убедитесь, что значение, которое вы вставляете во внешний ключ, существует в родительской таблице. Это помогло мне. Например , если вставить
user_id = 2
вtable.2
, ноtable.1
не имеетuser_id = 2
, то ограничение будет выдавать ошибку. Мой был код ошибки # 1452, если быть точным. Надеюсь, что это поможет кому-то еще с той же проблемой!источник
У меня была та же проблема, и причина была в том, что у меня была строка в первой таблице до добавления внешнего ключа.
источник
Я также столкнулся с той же проблемой, и проблема заключалась в том, что значение записей моей родительской таблицы не совпадало со значением таблицы внешнего ключа. Поэтому, пожалуйста, попробуйте после очистки всех строк.
источник
В случае, если решения, предоставленные другими, не сработали. Затем вы должны попытаться проверить движки баз данных родительской и дочерней таблиц. В моем случае я установил для движка родительских таблиц «MyISAM», изменив его на InnoDB, и исправил.
Надеюсь, что это помогает другим, которые застряли как я.
источник
Вы не должны помещать поле ondelete против каскада в базе данных.
Так что установите поле onDelete для RESTRICT
Удачи ♥
источник
Еще один странный случай, который дал мне эту ошибку. Я ошибочно связал свои внешние ключи с первичным ключом id. Это было вызвано неправильными командами alter table. Я узнал об этом, запросив таблицу INFORMATION_SCHEMA (см. Этот ответ по стеку)
Таблица была настолько запутана, что не могла быть исправлена никакими командами ALTER TABLE . Я наконец уронил стол и восстановил его. Это избавило от ошибки целостности.
источник
Может быть, пока вы добавили
userID
столбец, для этой определенной таблицы есть данные, для которых она установлена, поэтому она будет иметь значение по умолчанию0
, попробуйте добавить столбец безNOT NULL
источник
Я также получил эту ошибку: «Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется». Я получил ошибку при добавлении новой строки в родительскую таблицу
Проблема заключалась в том, что ограничение внешнего ключа было определено для родительской таблицы вместо дочерней таблицы.
источник
Если вы используете mysql индекс или отношение между таблицами, сначала вы удаляете столбцы (например, city_id) и создаете новые столбцы с тем же именем (например, city_id). Затем повторите попытку ...
источник
Существуют ли какие-либо данные, содержащиеся в таблице? Если это так, попробуйте очистить все данные в таблице, в которую вы хотите добавить внешний ключ. Затем снова запустите код (добавьте внешний ключ).
Я сталкивался с этой проблемой очень много раз. Эта очистка всех данных в таблице работает, когда вы хотите добавить внешний ключ в существующую таблицу.
Надеюсь, это работает :)
источник
Удалите индексы из поля UserID таблицы 2. Его костюмы для меня
источник
Эта ошибка возникает, когда вы хотите добавить внешний ключ со значениями, которых нет в первичном ключе родительской таблицы. Вы должны быть уверены, что новый внешний ключ UserID в table2 имеет значения, которые существуют в первичном ключе table1, иногда по умолчанию он равен нулю или равен 0.
Сначала вы можете обновить все поля внешнего ключа в таблице2, указав значение, которое существует в первичном ключе таблицы1.
Если вы хотите добавить разные идентификаторы пользователей, вы должны изменить в каждой строке нужные значения.
источник
Эта проблема может возникнуть по следующей причине:
Если вы делаете это в Spring mvc, вам нужно явно описать тип id, потому что иногда mysql не может распознать тип id. так что вы явно установите, как в обеих таблицах в вашем классе сущности
@GeneratedValue (strategy = GenerationType.IDENTITY)
источник