I’m having a bit of a strange problem. I’m trying to add a foreign key to one table that references another, but it is failing for some reason. With my limited knowledge of MySQL, the only thing that could possibly be suspect is that there is a foreign key on a different table referencing the one I am trying to reference.
I’ve done a SHOW CREATE TABLE
query on both tables, sourcecodes_tags
is the table with the foreign key, sourcecodes
is the referenced table.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
This is the code that generates the error:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
I’m having a bit of a strange problem. I’m trying to add a foreign key to one table that references another, but it is failing for some reason. With my limited knowledge of MySQL, the only thing that could possibly be suspect is that there is a foreign key on a different table referencing the one I am trying to reference.
I’ve done a SHOW CREATE TABLE
query on both tables, sourcecodes_tags
is the table with the foreign key, sourcecodes
is the referenced table.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
This is the code that generates the error:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
The MySQL ERROR 1452
happens when you try to execute a data manipulation query into a table that has one or more failing foreign key constraints.
The cause of this error is the values you’re trying to put into the table are not available in the referencing (parent) table.
Let’s see an example of this error with two MySQL tables.
Suppose you have a Cities
table that contains the following data:
+----+------------+
| id | city_name |
+----+------------+
| 1 | York |
| 2 | Manchester |
| 3 | London |
| 4 | Edinburgh |
+----+------------+
Then, you create a Friends
table to keep a record of people you know who lives in different cities.
You reference the id
column of the Cities
table as the FOREIGN KEY
of the city_id
column in the Friends
table as follows:
CREATE TABLE `Friends` (
`firstName` varchar(255) NOT NULL,
`city_id` int unsigned NOT NULL,
PRIMARY KEY (`firstName`),
CONSTRAINT `friends_ibfk_1`
FOREIGN KEY (`city_id`) REFERENCES `Cities` (`id`)
)
In the code above, a CONSTRAINT
named friends_ibfk_1
is created for the city_id
column, referencing the id
column in the Cities
table.
This CONSTRAINT
means that only values recoded in the id
column can be inserted into the city_id
column.
(To avoid confusion, I have omitted the id
column from the Friends
table. In real life, You may have an id
column in both tables, but a FOREIGN KEY
constraint will always refer to a different table.)
When I try to insert 5
as the value of the city_id
column, I will trigger the error as shown below:
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('John', 5);
The response from MySQL:
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails
(`test_db`.`friends`, CONSTRAINT `friends_ibfk_1`
FOREIGN KEY (`city_id`) REFERENCES `cities` (`id`))
As you can see, the error above even describes which constraint you are failing from the table.
Based on the Cities
table data above, I can only insert numbers between 1
to 4
for the city_id
column to make a valid INSERT
statement.
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('John', 1);
-- Query OK, 1 row affected (0.00 sec)
The same error will happen when I try to update the Friends
row with a city_id
value that’s not available.
Take a look at the following example:
UPDATE `Friends` SET city_id = 5 WHERE `firstName` = 'John';
-- ERROR 1452 (23000): Cannot add or update a child row
There are two ways you can fix the ERROR 1452
in your MySQL database server:
- You add the value into the referenced table
- You disable the
FOREIGN_KEY_CHECKS
in your server
The first option is to add the value you need to the referenced table.
In the example above, I need to add the id
value of 5
to the Cities
table:
INSERT INTO `Cities` VALUES (5, 'Liverpool');
-- Cities table:
+----+------------+
| id | city_name |
+----+------------+
| 1 | York |
| 2 | Manchester |
| 3 | London |
| 4 | Edinburgh |
| 5 | Liverpool |
+----+------------+
Now I can insert a new row in the Friends
table with the city_id
value of 5
:
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('Susan', 5);
-- Query OK, 1 row affected (0.00 sec)
Disabling the foreign key check
The second way you can fix the ERROR 1452
issue is to disable the FOREIGN_KEY_CHECKS
variable in your MySQL server.
You can check whether the variable is active or not by running the following query:
SHOW GLOBAL VARIABLES LIKE 'FOREIGN_KEY_CHECKS';
-- +--------------------+-------+
-- | Variable_name | Value |
-- +--------------------+-------+
-- | foreign_key_checks | ON |
-- +--------------------+-------+
This variable causes MySQL to check any foreign key constraint added to your table(s) before inserting or updating.
You can disable the variable for the current session only or globally:
-- set for the current session:
SET FOREIGN_KEY_CHECKS=0;
-- set globally:
SET GLOBAL FOREIGN_KEY_CHECKS=0;
Now you can INSERT
or UPDATE
rows in your table without triggering a foreign key constraint fails
:
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('Natalia', 8);
-- Query OK, 1 row affected (0.01 sec)
UPDATE `Friends` SET city_id = 17 WHERE `firstName` = 'John';
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0
After you’re done with the manipulation query, you can set the FOREIGN_KEY_CHECKS
active again by setting its value to 1
:
-- set for the current session:
SET FOREIGN_KEY_CHECKS=1;
-- set globally:
SET GLOBAL FOREIGN_KEY_CHECKS=1;
But please be warned that turning off your FOREIGN_KEY_CHECKS
variable will cause the city_id
column to reference a NULL
column in the cities
table.
It may cause problems when you need to perform a JOIN
query later.
Now you’ve learned the cause of ERROR 1452
and how to resolve this issue in your MySQL database server. Great work! 👍
0 / 0 / 0 Регистрация: 07.05.2015 Сообщений: 3 |
|
1 |
|
MySQL 07.05.2015, 14:14. Показов 28526. Ответов 9
При добавлении данных выдает эту ошибку:
__________________
0 |
Модератор 4190 / 3031 / 576 Регистрация: 21.01.2011 Сообщений: 13,111 |
|
07.05.2015, 15:20 |
2 |
При добавлении данных выдает эту ошибку Судя по сообщению ты хочешь добавить в дочернюю таблицу строку с несуществующим ключом FK (т.е. такого значения нет в родительской таблице). Так что смотри конкретные поля во вставляемой строке.
0 |
0 / 0 / 0 Регистрация: 07.05.2015 Сообщений: 3 |
|
07.05.2015, 16:35 [ТС] |
3 |
Обе таблицы имеют поля id которые являются ключом, имеют индекс поля user_id по которым и происходит связь.
0 |
Модератор 4190 / 3031 / 576 Регистрация: 21.01.2011 Сообщений: 13,111 |
|
07.05.2015, 17:06 |
4 |
Обе таблицы имеют поля id которые являются ключом Покажи DDL таблиц, а также пример своего INSERT
0 |
0 / 0 / 0 Регистрация: 07.05.2015 Сообщений: 3 |
|
07.05.2015, 20:20 [ТС] |
5 |
таблицы создавал и связывал в phpmyadmin, а как там сам запрос показать на создание таблиц я хз.
0 |
Модератор 4190 / 3031 / 576 Регистрация: 21.01.2011 Сообщений: 13,111 |
|
08.05.2015, 09:59 |
6 |
все работало до того как связал таблицы Есть подозрение, что ты их неправильно связал. Поэтому без DDL никак. А насчет INSERT — имеет смысл его показывать только с конкретными данными, имена переменных не говорят о том, что в них содержится.
0 |
0 / 0 / 0 Регистрация: 31.05.2015 Сообщений: 77 |
|
26.06.2015, 15:21 |
7 |
извините что встреваю, но у меня похожая проблема со связыванием не можете сказать что мне делать? я просто новичок в этом((( #1452 — Cannot add or update a child row: a foreign key constraint fails (`catalogue`.`#sql-c68_1f`, CONSTRAINT `#sql-c68_1f_ibfk_1` FOREIGN KEY (`id_category`) REFERENCES `category` (`id`))
0 |
14 / 3 / 0 Регистрация: 27.07.2018 Сообщений: 86 |
|
20.01.2019, 16:25 |
8 |
Надо внимательно проверить связываемое поле. Тип данных, беззнаковое — должна стоя ть галочка, поле по умолчанию под вопросом но значения в строках не должно быть «0» id со значением ноль не бывает.
0 |
4 / 4 / 0 Регистрация: 17.08.2016 Сообщений: 54 |
|
13.04.2019, 00:47 |
9 |
В дизайнере PHPMyAdmin, при создании связи, надо убедиться, что вы нажали сначала на родителя, а потом на детёныша, чтобы связь была от отца к сыну. Ну по крайней мере у меня всё починилось
0 |
0 / 0 / 0 Регистрация: 11.02.2020 Сообщений: 1 |
|
13.02.2020, 08:33 |
10 |
При ошибке #1452 может помочь установка связи между таблицами, а именно тип RESTRICT
0 |
У меня немного странная проблема. Я пытаюсь добавить внешний ключ в одну таблицу, которая ссылается на другую, но по какой-то причине он не работает. Из-за моего ограниченного знания MySQL, единственное, что может подозревать, — это наличие внешнего ключа в другой таблице, ссылающейся на ту, на которую я пытаюсь ссылаться.
Вот картина моих табличных отношений, сгенерированных через phpMyAdmin:
Отношения
Я сделал SHOW CREATE TABLE
запрос по обеим таблицам, sourcecodes_tags
это таблица с внешним ключом, sourcecodes
является ссылочной таблицей.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Было бы здорово, если бы кто-нибудь мог рассказать мне, что здесь происходит, у меня не было формального обучения или чего-то еще с MySQL 🙂
Благодарю.
Редактировать: Это код, который генерирует ошибку:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
227
Решение
Вполне вероятно ваш sourcecodes_tags
таблица содержит sourcecode_id
значения, которых больше нет в вашем sourcecodes
Таблица. Вы должны сначала избавиться от них.
Вот запрос, который может найти эти идентификаторы:
SELECT DISTINCT sourcecode_id FROM
sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id
WHERE sc.id IS NULL;
220
Другие решения
У меня была та же проблема с моей базой данных MySQL, но в конце концов я получил решение, которое сработало для меня.
Так как в моей таблице все было нормально с точки зрения mysql (обе таблицы должны использовать движок Innodb, а типы данных каждого столбца должны быть одного типа, которые участвуют в ограничении внешнего ключа).
Единственное, что я сделал, — отключил проверку внешнего ключа, а затем включил ее после выполнения операции с внешним ключом.
Шаги, которые я предпринял:
mysql> SET foreign_key_checks = 0; mysql> alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query OK, 8 rows affected (0.23 sec) Records: 8 Duplicates: 0 Warnings: 0 mysql> SET foreign_key_checks = 1;
90
использование NOT IN
чтобы найти, где ограничения сдерживающий:
SELECT column FROM table WHERE column NOT IN
(SELECT intended_foreign_key FROM another_table)
Итак, более конкретно:
SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN
(SELECT id FROM sourcecodes)
РЕДАКТИРОВАТЬ: IN
а также NOT IN
операторы, как известно, намного быстрее, чем JOIN
операторы, а также гораздо проще построить и повторить.
55
Обрежьте таблицы и попробуйте добавить ограничение FK.
Я знаю, что это решение немного неудобно, но оно работает на 100%. Но я согласен, что это не идеальное решение для решения проблемы, но я надеюсь, что это поможет.
23
Для меня эта проблема была немного другой и супер легко проверить и решить.
Вы должны убедиться, что ОБА из ваших таблиц InnoDB. Если одна из таблиц, а именно справочная таблица, является MyISAM, ограничение не будет выполнено.
SHOW TABLE STATUS WHERE Name = 't1';
ALTER TABLE t1 ENGINE=InnoDB;
15
Это также происходит при установке внешнего ключа для parent.id для child.column, если child.column уже имеет значение 0, а значение parent.id отсутствует 0
Вы должны убедиться, что каждый child.column имеет значение NULL или имеет значение, которое существует в parent.id
И теперь, когда я прочитал заявление, которое написал nos, это то, что он проверяет.
14
У меня была такая же проблема сегодня. Я проверил четыре вещи, некоторые из которых уже упоминались здесь:
-
Есть ли какие-либо значения в вашем дочернем столбце, которых нет в родительском столбце (кроме NULL, если дочерний столбец имеет значение NULL)?
-
У дочерних и родительских столбцов одинаковый тип данных?
-
Есть ли индекс родительского столбца, на который вы ссылаетесь? MySQL, кажется, требует этого по соображениям производительности (http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html)
-
И этот решил для меня: есть ли в обеих таблицах одинаковое сопоставление?
У меня был один стол в utf-8, а другой в iso-что-то. Это не сработало. После изменения iso-таблицы на сопоставление utf-8 ограничения могут быть добавлены без проблем. В моем случае phpMyAdmin даже не отображал дочернюю таблицу в iso-кодировке в раскрывающемся списке для создания ограничения внешнего ключа.
14
Кажется, есть недопустимое значение для столбца, например 0, которое не является допустимым внешним ключом, поэтому MySQL не может установить для него ограничение внешнего ключа.
Вы можете выполнить следующие действия:
-
Удалите столбец, для которого вы пытались установить ограничение FK.
-
Добавьте его еще раз и установите его значение по умолчанию как NULL.
-
Попробуйте снова установить ограничение внешнего ключа.
7