таблица 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
. Если вы опубликуете более подробный код, я смогу помочь вам диагностировать конкретную причину.
Это означает, что вы пытаетесь вставить в table2
значение UserID
, которое не существует в table1
.
Простой взлом может заключаться в отключении проверки внешних ключей перед выполнением любой операции на столе. Просто запрос
SET FOREIGN_KEY_CHECKS=0
Это отключит сопоставление внешних ключей с любыми другими таблицами. После того, как вы закончите с таблицей, включите ее снова
SET FOREIGN_KEY_CHECKS=1
Это работает для меня много раз.
Я обнаружил еще один странный случай: если вы случайно создаете внешний ключ из таблицы InnoDB в таблицу MyISAM, MySQL выдает эту ошибку во время вставки, даже если данные в противном случае действительны.
См. Http://nick.zoic.org/art/mysql-foreign-key-error/
Вы получаете эту ошибку, потому что есть какое-то значение table2.UserID
, которого нет в table1.UserID
(я предполагаю, что вы установили значение table2.UserID
вручную перед созданием этого внешнего ключа).
& Лт; br > Один пример для этой сцены: table1.UserID
получает значения 1,2,3 и table2.UserID
получает значения 4 (добавляется вручную). Поэтому, когда вы делаете внешний ключ, они не могут найти UserID = 4
из table1
, и ошибка будет устранена.
& Лт; br > Чтобы исправить эту ошибку, просто удалите UserID = 4
из table2
или вы можете очистить их обоих, а затем создать внешний ключ и.
Удачи!
Если вы вставили строку в таблицу 1 до создания внешнего ключа в таблице 2, то получите ошибку ограничения внешнего ключа, поскольку значение автоприращения равно 2 в таблице 1 и 1 в таблице 2. Для решения этой проблемы необходимо усечь таблицу 1 и установить значение автоприращения равным 1. После этого можно добавить таблицу 2.
У меня была та же проблема, решение простое.
Вы пытаетесь добавить идентификатор в дочернюю таблицу, который не существует в родительской таблице.
проверьте хорошо, потому что InnoDB имеет ошибку, которая иногда увеличивает столбец auto_increment без добавления значений, например, `INSERT ... НА ДУБЛИКАТНОМ КЛЮЧЕ
Убедитесь, что вы установили для механизма базы данных значение InnoDB, поскольку в MyISAM внешний ключ и транзакция не поддерживаются
У меня была похожая проблема. Вы пытаетесь применить внешний ключ к таблице, которая имеет содержимое, и столбец не является недействительным. У вас есть два варианта.
@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;
@Column(insertable = false, nullable = true)
private int UserID;
Убедитесь, что значение, которое вы вставляете в внешний ключ, существует в родительской таблице. Это помогло мне. Например, если вы вставите user_id = 2
в table.2
, но table.1
не имеет user_id = 2
, ограничение приведет к ошибке. Мой был код ошибки # 1452, если быть точным. Надеюсь, это поможет кому-то еще с той же проблемой!
Это заняло у меня некоторое время, чтобы понять. Проще говоря, таблица, которая ссылается на другую таблицу, уже имеет данные, и одно или несколько ее значений не существуют в родительской таблице.
например. Таблица 2 имеет следующие данные:
UserID PostID Title Summary
5 1 Lorem Ipsum dolor sit
Table1
UserID Password Username Email
9 ******** JohnDoe [email protected]
Если вы попытаетесь добавить ALTER table2 и добавить внешний ключ, запрос завершится ошибкой, поскольку UserID = 5 не существует в Table1.
Я также столкнулся с той же проблемой, и проблема заключалась в том, что значение записей в родительской таблице не совпадает со значением таблицы внешних ключей. Поэтому, пожалуйста, попробуйте после очистки всех строк..
Не следует помещать поле ondelete против каскада в базе данных.
Поэтому установите поле onDelete в RESTRICT
Удачи ♥
Еще один странный случай, который дал мне эту ошибку. Я ошибочно сослался на свои внешние ключи на первичный ключ id. Это было вызвано неправильным изменением команд таблицы. Я узнал об этом, запросив таблицу INFORMATION_SCHEMA (см. Этот ответ по стековому потоку)
Таблица была настолько запутанной, что ее нельзя было исправить с помощью команд ALTER TABLE . Я наконец бросил стол и реконструировал его. Это избавило от целостностиError.
Если вы используете индекс mysql или отношение между таблицами, сначала вы удаляете столбцы (например: city_id) и создаете новые столбцы с тем же именем (например: city_id). Затем попробуйте еще раз...
Есть ли какие-либо существующие данные, которые содержатся в таблице? Если это так, попробуйте очистить все данные в таблице, которую вы хотите добавить внешним ключом. Затем снова запустите код (добавьте внешний ключ).
Я сталкивался с этой проблемой так много раз. Это удаление всех данных в таблице работает, когда вы хотите добавить внешний ключ в существующую таблицу.
Надеюсь, это сработает :)
Я также получил эту ошибку: «Не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется». Я получил ошибку при добавлении новой строки в родительскую таблицу
Проблема заключалась в том, что ограничение внешнего ключа было определено в родительской таблице вместо дочерней таблицы.