Меню

Ошибка создания внешнего ключа на id проверьте типы данных

Дата: 2.12.2016

Автор: Василий Лукьянчиков , vl (at) sqlinfo (dot) ru

Функционирование внешних ключей в MySQL имеет много нюансов и ограничений из-за чего существует немало возможностей получить ошибку при работе с ними. Одна из проблем состоит в том, что сообщения об ошибках содержат мало полезной информации и не указывают причину возникновения ошибки. В данной статье дается объяснение как получить дополнительную информацию об ошибке и приведен полный список причин возникновения ошибок внешних ключей. Каждая причина снабжена уникальным буквенно-цифровым кодом (А4, Б1, ..), использующимся в сводной таблице в конце статьи, которая поможет вам быстро диагностировать проблему.

Внешний ключ — это поле (или набор полей) в таблице, называемой дочерней, которое ссылается на поле (или набор полей) в таблице, называемой родительской. Дочерняя и родительская таблицы могут совпадать, т.е. таблица будет ссылаться на саму себя. Внешние ключи позволяют связать записи в двух таблицах по определенным полям так, что при обновлении поля в родительской автоматически происходит изменение записи в дочерней таблице.

В MySQL внешние ключи не реализованы на уровне сервера, их поддержка зависит от используемого хранилища данных. Содержание статьи справедливо для InnoDB (в том числе и для XtraDB).

Как получить больше данных об ошибке

После получения ошибки выполните SHOW ENGINE INNODB STATUS и смотрите содержимое секции LATEST FOREIGN KEY ERROR. Этот способ имеет следующие недостатки:

  • требует привилегии SUPER
  • содержит информацию о последней ошибке, связанной с внешними ключами, из-за чего нужно выполнять SHOW ENGINE INNODB STATUS сразу после возникновения ошибки, что не всегда удобно/возможно
  • используются внутренние имена таблиц (например, ‘test.#sql-d88_b’), что затрудняет диагностику
  • порой содержит мало полезной информации или таковая вообще отсутствует.

Альтернатива: использовать MariaDB версий больше 5.5.45 и 10.0.21, в которых сообщения об ошибках значительно улучшены и указывают причину возникновения ошибки.

Errno 150

Если в сообщении об ошибке содержится errno 150 (или errno 121), значит парсер MySQL не смог распознать ошибку и передал команду (create/alter) на выполнение в InnoDB. В этом разделе перечислены ситуации, приводящие к ошибкам, содержащим errno 150.

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

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

Другой неочевидный момент: на колонке родительской таблицы есть индекс — префиксный. Но внешний ключ всё равно не создается и сервер ругается на отсутствие индекса. Это происходит потому, что индекс должен быть определен на всей длине колонки.

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

Примеры

create table t1 (a int, b int, index(a)) engine=innodb;

create table t2 (a int, foreign key (a) references t1(a), foreign key (a) references t1(b)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

SHOW ENGINE INNODB STATUS;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-16 06:37:39 0x14c1c Error in foreign key constraint of table test/t2:
foreign key (a) references t1(b)) engine=innodb:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constr
aints.html for correct foreign key definition.
————

— при использовании оператора ALTER ошибка и секция
— LATEST FOREIGN KEY ERROR будут содержать внутреннее имя таблицы test.#sql-a64_1

create table t2 (a int) engine=innodb;
alter table t2 add foreign key (a) references t1(a), add foreign key (a) references t1(b);
ERROR 1005 (HY000): Cannot create table ‘test.#sql-a64_1’ (errno: 150)

— в новых версиях парсер MySQL определяет некорректность
— конструкции и возвращает другую ошибку (без errno 150)

alter table t2 add foreign key (a) references t1(a), add foreign key (a) references t1(b);
ERROR 1215 (HY000): Cannot add foreign key constraint

— аналогично и для оператора CREATE

drop table t2;
create table t2 (a int, foreign key (a) references t1(a), foreign key (a) references t1(b)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

Обратите внимание, если внешний ключ уже существует и в результате изменений (alter table) возникает ситуация отсутствия индекса в родительской таблице, то код ошибки будет 1025:

create table t1 (a int, b int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

alter table t1 drop a;
ERROR 1025 (HY000): Error on rename of ‘.test#sql-d6c_5′ to ‘.testt1′ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161220  7:14:25 Error in foreign key constraint of table test/t2:
there is no index in referenced table which would contain
the columns as the first columns, or the data types in the
referenced table do not match the ones in table. Constraint:
,
  CONSTRAINT «t2_ibfk_1» FOREIGN KEY («a») REFERENCES «t1» («a»)
The index in the foreign key in table is «a»
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
InnoDB: Renaming table `test`.`#sql-d6c_5` to `test`.`t1` failed!
———

А2. Родительская таблица не найдена в словаре данных InnoDB. Это означает, что родительская таблица должна существовать и быть постоянной InnoDB таблицей. Не временной InnoDB таблицей, так как информация о временных таблицах не сохраняется в словаре данных InnoDB. И уж тем более не представлением.

Примеры

mysql> create table t1 (a int, index(a)) engine=myisam;

mysql> create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

— в старых версиях будет ошибка вида
ERROR 1005 (HY000): Cannott create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-17 16:30:09 0x364c Error in foreign key constraint of table world/t2:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
————

А3. Синтаксическая ошибка. Внешние ключи реализованы на уровне хранилища, и в старых версиях парсер сервера MySQL не распознавал синтаксические ошибки внешних ключей, из-за чего их было трудно идентифицировать.

Примеры

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

create table t1(id int not null primary key, b int, key(b)) engine=innodb;
Query OK, 0 rows affected (0.22 sec)

alter table t1 add foreign key(id,b) references t1(id);
ERROR 1005 (HY000): Can‘t create table ‘test.#sql-d88_b’ (errno: 150)

show warnings;
+——-+——+—————————————————+
| Level | Code | Message                                           |
+——-+——+—————————————————+
| Error | 1005 | Can‘t create table ‘test.#sql-d88_b’ (errno: 150) |
+——-+——+—————————————————+

— понять, что причина в синтаксической ошибке
— можно только из:

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
160605 22:28:23 Error in foreign key constraint of table test/#sql-d88_b:
foreign key(id,b) references t1(id):
Syntax error close to:

— в новых версиях парсер распознает синтаксическую ошибку
— и сообщает об этом:
ERROR 1239 (42000): Incorrect foreign key definition for ‘foreign key without name’: Key reference and table reference don‘t match

Другой пример: попробуем создать внешний ключ на поле типа text:

create table t1 (a text , index(a(50))) engine=innodb;

create table t2 (a text, foreign key (a) references t1(a)) engine=innodb;
ERROR 1170 (42000): BLOB/TEXT column ‘a’ used in key specification without a key length

— MySQL автоматически пытается создать индекс на колонке `a`, и
— сообщает, что нельзя создать индекс по всей длине поля типа text.
— Хорошо, укажем префикс и получим errno 150:

create table t2 (a text, foreign key (a(50)) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

— понять, что произошла ошибка синтаксиса можно:
— или через show engine innodb status;
— или внимательно сравнить разрешенный синтаксис в документации
— с написанной командой.

А4. Несовпадение типов данных. Столбцы дочерней таблицы, входящие в определение внешнего ключа, должны иметь такие же типы данных, что и столбцы родительской таблицы, на которые они ссылаются, вплоть до атрибутов: знак и кодировка/сопоставление.

Примеры

— например, если у одной колонки мы определим
— атрибут unsigned, а у другой нет, то:
create table t1 (a int unsigned, index(a)) engine=innodb;

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

— в старых версиях будет ошибка вида
ERROR 1005 (HY000): Cannott create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-26 03:00:47 0x10894 Error in foreign key constraint of table world/t2:
foreign key (a) references t1(a)) engine=innodb:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constr
aints.html for correct foreign key definition.
————

Если несоответствие типов данных возникает во время изменения таблицы при уже существующем внешнем ключе, то ошибка будет иметь вид:

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

MariaDB [test]> alter table t1 modify a int unsigned;
ERROR 1025 (HY000): Error on rename of ‘.test#sql-d6c_6′ to ‘.testt1′ (errno: 150)

А5. Некорректно задано действие внешнего ключа. Если в определении внешнего ключа указано ON UPDATE SET NULL и/или ON DELETE SET NULL, то соответствующие столбцы дочерней таблицы не должны быть определены как NOT NULL.

Примеры

create table t1 (a int not null, index(a)) engine=innodb;

create table t2 (a int not null, foreign key (a) references t1(a) on delete set null) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

— в старых версиях будет:
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
2016-11-26 06:24:42 0x10894 Error in foreign key constraint of table world/t2:
foreign key (a) references t1(a) on delete set null) engine=innodb:
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
————

Если коллизия возникает при уже существующем внешнем ключе, то:

create table t1 (a int not null, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a) on delete set null) engine=innodb;

alter table t2 modify a int not null;
ERROR 1025 (HY000): Error on rename of ‘.test#sql-d6c_6′ to ‘.testt2′ (errno: 150)

А6. Дочерняя таблица является временной InnoDB таблицей. Внешние ключи можно создавать только в постоянной, несекционированной InnoDB таблице.

Примеры

create table t1 (a int, index(a)) engine=innodb;

create temporary table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161130  4:22:26 Error in foreign key constraint of table temp/#sql318_4_1:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
———

— в новых версиях ошибка будет иметь вид:
ERROR 1215 (HY000): Cannot add foreign key constraint

А7. Родительская таблица является секционированной таблицей. На данный момент (MySQL 5.7 и MariaDB 10.1) внешние ключи не поддерживаются для секционированных таблиц (partitioned tables). Иными словами, ни родительская, ни дочерняя таблица не должны иметь секции. В случае, когда внешний ключ ссылается на секционированную таблицу диагностика ошибки затруднена ошибкой вывода show engine innodb status:

Примеры

create table t1 (a int, index(a)) partition by range (a)  
(partition p0 values less than (10),
partition p1 values less than (20),
partition p2 values less than maxvalue);

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t2’ (errno: 150)

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161223 19:38:14 Error in foreign key constraint of table test/t2:
foreign key (a) references t1(a)) engine=innodb:
Cannot resolve table name close to:
(a)) engine=innodb
———
— сообщение указывает на то, что родительская таблица
— не найдена в словаре данных innodb (bug: 84331)

— в новых версиях ошибка будет иметь вид:

create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;
ERROR 1215 (HY000): Cannot add foreign key constraint

Если разбивать на секции родительскую таблицу после создания внешнего ключа, то

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

alter table t1 PARTITION BY HASH(a) PARTITIONS 8;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

show engine innodb status;
— не содержит секцию LATEST FOREIGN KEY ERROR

Errno 121

Такой результат возникает только в одном случае.

Б1. Неуникальное имя ограничения. Обратите внимание: речь не о имени внешнего ключа. Если при создании внешнего ключа вы указываете не обязательное ключевое слово CONSTRAINT, то идущий после него идентификатор должен быть уникальным в пределах базы данных.

Примеры

create table t1 (a int, index(a)) engine=innodb;

create table t2 (a int, CONSTRAINT q1 foreign key (a) references t1(a)) engine=innodb;

create table t3 (a int, CONSTRAINT q1 foreign key (a) references t1(a)) engine=innodb;
ERROR 1005 (HY000): Cannot create table ‘test.t3’ (errno: 121)

— в 5.7 будет другая ошибка
ERROR 1022 (23000): Cannot write; duplicate key in table ‘t3’

show engine innodb status;
————————
LATEST FOREIGN KEY ERROR
————————
161130  3:31:11 Error in foreign key constraint creation for table `test`.`t3`.
A foreign key constraint of name `test`.`q1`
already exists. (Note that internally InnoDB adds ‘databasename’
in front of the user-defined constraint name.)
Note that InnoDB FOREIGN KEY system tables store
constraint names as case-insensitive, with the
MySQL standard latin1_swedish_ci collation. If you
create tables or databases whose names differ only in
the character case, then collisions in constraint
names can occur. Workaround: name your constraints
explicitly with unique names.
———

Нет ошибок

Внешний ключ не создается, и нет никаких ошибок. Это может происходить по следующим причинам:

В1. Дочерняя таблица не является InnoDB таблицей. В этом случае для совместимости с другими субд парсер MySQL просто проигнорирует конструкцию внешнего ключа.

Примеры

create table t1 (a int, index(a)) engine=innodb;

create table t2 (a int, foreign key (a) references t1(a)) engine=myisam;
Query OK, 0 rows affected (0.33 sec)

MariaDB [test]> show create table t2G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `a` int(11) DEFAULT NULL,
  KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

В2. Не соответствует синтаксису MySQL. Стандарт SQL разрешает указывать внешний ключ сразу при объявлении колонки с помощью конструкции REFERENCES (например, … a int references t1(a), …), однако MySQL игнорирует такую форму записи. Единственный способ создать в нем внешний ключ — это использовать отдельный блок FOREIGN KEY:

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, …)
    REFERENCES tbl_name (index_col_name,…)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

Несоответствие данных

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

Г1. Удаление родительской таблицы. Нельзя удалить родительскую таблицу при наличии внешнего ключа.

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

drop table t1;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Удаление следует понимать в расширенном варианте как удаление из множества InnoDB таблиц. Например, если мы сменим (alter table) движок родительской таблицы на MyISAM, то с точки зрения ограничения внешнего ключа родительская таблица перестанет существовать (т.к. она должна быть постоянной innodb таблицей):

alter table t1 engine=myisam;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

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

select table_name from information_schema.key_column_usage
where table_schema = «test» and references_table_name = «t1»;

Г2. Изменение данных в родительской таблице. Если в определении внешнего ключа не задано действие при update/delete, то такие операции над родительской таблицей могут привести к несогласованности данных, т.е. появлению в дочерней таблице записей не имеющих соответствия в родительской таблице.

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

insert into t1 values(1);
insert into t2 values(1);

update t1 set a=2;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1`(`a`))

Г3. Изменение данных в дочерней таблице. Если insert/update записи в дочерней таблицы приводит к несогласованности данных, то

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, foreign key (a) references t1(a)) engine=innodb;

insert into t2 values(15);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))

Г4. Добавление внешнего ключа на не пустую таблицу. При попытке добавить внешний ключ на таблицу, в которой есть записи, не удовлетворяющие условию внешнего ключа (т.е. не имеющие соответствия в родительской таблице), будет ошибка:

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, index(a)) engine=innodb;

insert into t2 values(2);

alter table t2 add foreign key (a) references t1(a);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`#sql-3f0_4`, CONSTRAINT `#sql-3f0_4_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))

Г5. Не уникальный ключ в родительской таблице. По стандарту SQL набор полей, на которые ссылается внешний ключ, должен быть уникальным. Однако, реализация внешних ключей в InnoDB позволяет иметь несколько «родителей». Из-за этого возникает трудно диагностируемая ошибка:

Примеры

create table t1 (a int, index(a)) engine=innodb;
create table t2 (a int, index(a)) engine=innodb;

insert into t1 values (1),(1);
insert into t2 values(1);

delete from t1 where a=1 limit 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1`(`a`))

Сводная таблица

По вертикали расположены коды ошибок MySQL, которые возникают при работе с внешними ключами («нет ошибок» соответствует ситуации, когда сервер не генерирует ошибку, но и не создает внешний ключ). По горизонтали — идентификаторы причин, которые могут привести к ошибке. Плюсы на пересечении указывают какие причины приводят к той или иной ошибке.

А1 А2 А3 А4 А5 А6 А7 Б1 В1 В2 Г1 Г2 Г3 Г4 Г5
MySQL error 1005 + + + + + + + +
MySQL error 1022 +
MySQL error 1025 + + +
MySQL error 1215 + + + + +
MySQL error 1217 + +
MySQL error 1239 +
MySQL error 1451 + +
MySQL error 1452 + +
нет ошибок + +

P.S. Если ваш случай не рассмотрен в статье, то задавайте вопрос на форуме SQLinfo. Вам ответят, а статья будет расширена.

Дата публикации: 2.12.2016

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

here is my table :

CREATE TABLE `pesanan` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ref_number` varchar(50) NOT NULL DEFAULT '',
  `id_produk` int(11) NOT NULL,
  `id_user` int(11) NOT NULL,
  `qty` int(11) NOT NULL,
  `total` varchar(50) NOT NULL DEFAULT '',
  `tanggal` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

i want to create a relation of id_produk to table produk.id and id_user to user.id, here is the other table :

CREATE TABLE `produk` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id_kategori` int(11) NOT NULL,
  `status` varchar(10) NOT NULL DEFAULT '',
  `slug` varchar(100) NOT NULL DEFAULT '',
  `judul` varchar(100) NOT NULL DEFAULT '',
  `harga` varchar(10) DEFAULT '',
  `target` int(11) DEFAULT NULL,
  `desc` text,
  `cover` varchar(100) DEFAULT NULL,
  `tanggal` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1;

and user table

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `suspended` int(11) DEFAULT NULL,
  `level` varchar(11) DEFAULT NULL,
  `nama` varchar(100) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `password` varchar(100) DEFAULT NULL,
  `alamat` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=latin1;

when i try to relation it , it give me this error :

Error creating foreign key on id_produk (check data types)

here is my table :

CREATE TABLE `pesanan` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ref_number` varchar(50) NOT NULL DEFAULT '',
  `id_produk` int(11) NOT NULL,
  `id_user` int(11) NOT NULL,
  `qty` int(11) NOT NULL,
  `total` varchar(50) NOT NULL DEFAULT '',
  `tanggal` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

i want to create a relation of id_produk to table produk.id and id_user to user.id, here is the other table :

CREATE TABLE `produk` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id_kategori` int(11) NOT NULL,
  `status` varchar(10) NOT NULL DEFAULT '',
  `slug` varchar(100) NOT NULL DEFAULT '',
  `judul` varchar(100) NOT NULL DEFAULT '',
  `harga` varchar(10) DEFAULT '',
  `target` int(11) DEFAULT NULL,
  `desc` text,
  `cover` varchar(100) DEFAULT NULL,
  `tanggal` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1;

and user table

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `suspended` int(11) DEFAULT NULL,
  `level` varchar(11) DEFAULT NULL,
  `nama` varchar(100) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `password` varchar(100) DEFAULT NULL,
  `alamat` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=latin1;

when i try to relation it , it give me this error :

Error creating foreign key on id_produk (check data types)

Сбой ограничения внешнего ключа с сообщением «Ошибка создания внешнего ключа в [таблице] (проверьте типы данных)»

Следующий запрос завершается с ошибкой «Ошибка создания внешнего ключа для города (проверьте типы данных)»:

ALTER TABLE  `hotels` ADD FOREIGN KEY (  `city` )
REFERENCES  `mydatabase`.`cities` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE ;

По сути, я хочу иметь отношение «один ко многим» между city.id и hotels.city.

Вот обе таблицы:

CREATE TABLE IF NOT EXISTS `cities` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;


CREATE TABLE IF NOT EXISTS `hotels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `city` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `city` (`city`)
) ENGINE=InnoDB;

8 ответы

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

Добавление внешнего ключа в представление отношений

ответ дан 29 авг.

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

Ситуация у меня была следующая:

Table 1: administrations (Primary key: AdministrationId)
Table 2: invoices (Foreign key to AdministrationId)
Table 3: users (error pops up while creating foreign key)

Колонны AdministrationId В моем invoices и users таблицы были того же типа, что и AdministrationId столбца в administrations таблице.

Ошибка с моей стороны заключалась в том, что я пытался создать внешний ключ с именем administration_id В моем users Таблица. Но за минуту до этого я уже создал внешний ключ в своем invoices таблица также называется administration_id. Когда я попытался дать внешнему ключу другое имя, все получилось.

Поэтому не забывайте правильно называть свои внешние ключи (например, добавляйте к ним префикс имени таблицы, например: invoices_administration_id и users_administration_id). Несколько внешних ключей с одинаковым именем могут не существовать (в одной и той же базе данных).

Создан 30 июля ’18, 16:07

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

Мои столбцы были как bigint, так и без знака. Однако после первого создания таблиц, на которые ссылаются, я затем изменил имя столбца первичного ключа. Больше ничего в этом не изменилось, но мне не удалось создать отношение внешнего ключа. В итоге я удалил ссылочные таблицы и воссоздал их, используя нужные мне имена столбцов, и мне удалось создать отношения внешнего ключа.

ответ дан 05 авг.

Обновление hotels.city в unsigned работал на меня. Так как cities.id is unsigned

ответ дан 23 дек ’17, 07:12

Я хотел бы отметить, что вы получите аналогичную ошибку, если вы установили внешний ключ на NOT NULL и вы установили либо ON DELETE or ON UPDATE в SET NULL.

ответ дан 22 мар ’22, в 20:03

Типы данных должны совпадать:

cities.id int(11)
hotels.city bigint(20)

Должен стать либо:

cities.id bigint(20)
hotels.city bigint(20)

Или:

cities.id int(11)
hotels.city int(11)

В зависимости от того, что нужно вашему приложению.

Также стоит упомянуть тот факт, что оба должны быть либо подписаны, либо не подписаны.

Вам может понадобиться OPTIMIZE ваши таблицы после изменения типов данных для соответствия.

Создан 03 июля ’16, 15:07

Стоит упомянуть, но сопоставление должно быть одинаковым между обеими таблицами.

Я столкнулся с той же проблемой с полями varchar (64) в обеих таблицах, и мне потребовалось некоторое время, чтобы определить, что проблема исходила из поля сопоставления, которое не было одинаковым между двумя полями таблицы.

ответ дан 14 авг.

Обновление типа данных cities.id bigint(20) и hotels.city bigint(20)
ИЛИ Обновление типа данных cities.id int(11) и hotels.city int(11)
И обновление hotels.city в unsigned , так как: cities.id is unsigned.

ответ дан 29 окт ’21, 07:10

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

mysql

or задайте свой вопрос.

Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Ask Question

Asked
1 year, 10 months ago

Modified
1 year, 10 months ago

Viewed
61 times

0

Although my data types are same then why it returns me that error

Error creating foreign key on users_id (check data types)

In foreign table users_id is int 50 and unsigned and in user table id is primary key and int 50

  • mysql
  • laravel

Improve this question

asked Mar 11, 2021 at 11:06

alex 's user avatar

alex alex

937 bronze badges

1

  • The size and sign of fixed precision types such as INTEGER and DECIMAL must be the same.- dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

    – P.Salmon

    Mar 11, 2021 at 11:10

Add a comment
 | 

1 Answer

Sorted by:

Reset to default

0

If you are using the id() method to create the id in a laravel migration, the related foreign key field on the other table should use the unsignedBigInteger().

You can also use foreignId();

https://laravel.com/docs/master/migrations#column-method-foreignI

Improve this answer

answered Mar 11, 2021 at 11:26

James Clark's user avatar

James ClarkJames Clark

1,2832 gold badges9 silver badges14 bronze badges

Add a comment
 | 

Your Answer

Sign up or log in

Sign up using Google

Sign up using Facebook

Sign up using Email and Password

Post as a guest

Name

Email

Required, but never shown

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you’re looking for? Browse other questions tagged

  • mysql
  • laravel

or ask your own question.

  • The Overflow Blog
  • The less JavaScript, the better (Ep. 532)

  • Is software getting worse?

  • Featured on Meta
  • Accessibility Update: Colors

  • Introducing a new close reason specifically for non-English questions

  • We’re bringing advertisements for technology courses to Stack Overflow

  • 2022: a year in moderation

  • Temporary policy: ChatGPT is banned

Related

1043

How can I do ‘insert if not exists’ in MySQL?

832

Host ‘xxx.xx.xxx.xxx’ is not allowed to connect to this MySQL server

321

Can table columns with a Foreign Key be NULL?

1110

Insert into a MySQL table or update if exists

220

Cannot add or update a child row: a foreign key constraint fails

408

Add Foreign Key to existing table

1132

MySQL error code: 1175 during UPDATE in MySQL Workbench

360

MySQL Cannot Add Foreign Key Constraint

386

MySQL Error 1215: Cannot add foreign key constraint

253

Migration: Cannot add foreign key constraint

Hot Network Questions

  • What is really meant by max 240 kt, 220 kt and 185 kt in the picture of Jeppesen chart?

  • Is indifference to ethical dicussion by definition unethical?

  • nested alignment with arbitrary align location

  • How to install the latest version of one particular package

  • What popularized the idea of aliens having a pair of antennae on their heads?

  • How many generations could a small group go without suffering the effects of inbreeding

  • Dominion — How does Hireling work Throne Room or Kings Court?

  • If humans had no access to gunpowder, what else would they use to power guns?

  • in four months / after four months / four months later

  • I want to nerf my character for roleplay purposes, but I fear I might have the «My Guy Syndrome»

  • Should I keep my Lightning node data around after decomissioning?

  • Creates a regular polygon with n vertices given two points

  • Why is my iPhone crashing and reporting higher battery percentage?

  • Should math for elementary teachers content be taught under the direction of the math department?

  • Why does the CMB conform to black-body formula for 2.71 degrees, when it’s the stretched emission at a far hotter temp?

  • Garbage disposal jammed

  • How do I attach two hot wires to a single terminal?

  • When speaking to a judge in court, what do barristers mean by «May I take instructions?»

  • Why does the price keep changing after I click on a flight deal in Expedia?

  • Origins of the «threaded fastener pullout formula»

  • Who is this robot from the Magazine of Fantasy and Science Fiction?

  • Is there a standardized way to classify languages according to how much the order of the words is tied to the words themselves?

  • Ravioli filled with goat cheese

  • History of High Availability in the mainframe and minicomputer eras?

more hot questions

Question feed

Your privacy

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Ask Question

Asked
1 year, 10 months ago

Modified
1 year, 10 months ago

Viewed
61 times

0

Although my data types are same then why it returns me that error

Error creating foreign key on users_id (check data types)

In foreign table users_id is int 50 and unsigned and in user table id is primary key and int 50

  • mysql
  • laravel

Improve this question

asked Mar 11, 2021 at 11:06

alex 's user avatar

alex alex

937 bronze badges

1

  • The size and sign of fixed precision types such as INTEGER and DECIMAL must be the same.- dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

    – P.Salmon

    Mar 11, 2021 at 11:10

Add a comment
 | 

1 Answer

Sorted by:

Reset to default

0

If you are using the id() method to create the id in a laravel migration, the related foreign key field on the other table should use the unsignedBigInteger().

You can also use foreignId();

https://laravel.com/docs/master/migrations#column-method-foreignI

Improve this answer

answered Mar 11, 2021 at 11:26

James Clark's user avatar

James ClarkJames Clark

1,2832 gold badges9 silver badges14 bronze badges

Add a comment
 | 

Your Answer

Sign up or log in

Sign up using Google

Sign up using Facebook

Sign up using Email and Password

Post as a guest

Name

Email

Required, but never shown

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you’re looking for? Browse other questions tagged

  • mysql
  • laravel

or ask your own question.

  • The Overflow Blog
  • The less JavaScript, the better (Ep. 532)

  • Is software getting worse?

  • Featured on Meta
  • Accessibility Update: Colors

  • Introducing a new close reason specifically for non-English questions

  • We’re bringing advertisements for technology courses to Stack Overflow

  • 2022: a year in moderation

  • Temporary policy: ChatGPT is banned

Related

1043

How can I do ‘insert if not exists’ in MySQL?

832

Host ‘xxx.xx.xxx.xxx’ is not allowed to connect to this MySQL server

321

Can table columns with a Foreign Key be NULL?

1110

Insert into a MySQL table or update if exists

220

Cannot add or update a child row: a foreign key constraint fails

408

Add Foreign Key to existing table

1132

MySQL error code: 1175 during UPDATE in MySQL Workbench

360

MySQL Cannot Add Foreign Key Constraint

386

MySQL Error 1215: Cannot add foreign key constraint

253

Migration: Cannot add foreign key constraint

Hot Network Questions

  • Command-line Tower of Hanoi game

  • If we stick to «The Way» in Taoism, won’t it be sinful?

  • When speaking to a judge in court, what do barristers mean by «May I take instructions?»

  • Need help with students who’ve turned my class into a dating service

  • TV sci-fi show with strong female lead who looks after artifacts and also had Nikola Tesla in it

  • How to achieve a 200 Nm tightening torque when installing a freewheel body?

  • Install a DOS application consisting of 5 .IMG files (when expanded) on Windows 10 running DOSBox-X

  • Could a humantaur in the US be accepted to West Point and/or have a career in the US Military?

  • Why is NVMe better than ATA?

  • Multiple Voices in «Rock» Piano

  • Joining two lists element by element

  • «Semitic languages» in Classical Latin

  • How to install the latest version of one particular package

  • Paint dumped into our garden, how bad is it?

  • What popularized the idea of aliens having a pair of antennae on their heads?

  • How to power a 24 VAC pump with 24 VDC?

  • Origins of the «threaded fastener pullout formula»

  • Is there a standardized way to classify languages according to how much the order of the words is tied to the words themselves?

  • Multiattack defense vs legendary actions

  • Energy needed to stop the Earth’s inner core —and its effects?

  • Why did merely Canada retain the rank of Brigadier General? But not Australia, New Zealand, or UK?

  • I ripped the lead off this film capacitor by mistake — is it beyond repair?

  • Does «bunkey» mean fool?

  • Garbage disposal jammed

more hot questions

Question feed

Your privacy

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Кажется, у меня возникли проблемы с настройкой Foreign Key между двумя моими таблицами.

Вот предложение CREATE для каждой таблицы:

CREATE TABLE IF NOT EXISTS `dbname`.`CallRecord` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `user_id` INT NOT NULL,
  `city_id` INT NOT NULL,
  `created` DATETIME NULL,
  `timestamp` TIMESTAMP NULL,
  PRIMARY KEY (`id`),
  INDEX `user_id_fk_idx` (`user_id` ASC),
  INDEX `city_id_fk_idx` (`city_id` ASC),
  CONSTRAINT `user_id_fk`
    FOREIGN KEY (`user_id`)
    REFERENCES `dbname`.`User` (`id`)
    ON DELETE RESTRICT
    ON UPDATE NO ACTION,
  CONSTRAINT `city_id_fk`
    FOREIGN KEY (`city_id`)
    REFERENCES `dbname`.`City` (`id`)
    ON DELETE RESTRICT
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

И вот другая таблица:

CREATE TABLE IF NOT EXISTS `dbname`.`DataCallAssoc` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `data_id` INT NOT NULL,
  `call_record_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `data_id_fk_idx` (`data_id` ASC),
  INDEX `call_record_id_fk_idx` (`call_record_id` ASC),
  CONSTRAINT `data_id_fk`
    FOREIGN KEY (`data_id`)
    REFERENCES `dbname`.`Data` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `call_record_id_fk`
    FOREIGN KEY (`call_record_id`)
    REFERENCES `dbname`.`CallRecord` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Проблема заключается в последнем CONSTRAINT of DataCallAssoc:

  CONSTRAINT `call_record_id_fk`
    FOREIGN KEY (`call_record_id`)
    REFERENCES `dbname`.`CallRecord` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)

Я получаю эту ошибку:

Error creating foreign key on call_record_id (check data types)

Даже когда я создаю таблицу и внешние ключи отдельно. Все остальные внешние ключи работают, и даже другие таблицы, которые указывают на CallRecord.id как внешний ключ, работают.

Я также проверил, что CallRecord.id совпадает с DataCallAssoc.call_record_id в терминах структуры.

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

Этого времени хватило,чтобы возненавидеть эту технологию.

И так код:

CREATE database thraph;
USE thraph;

CREATE TABLE `userdata` (
  u_id INT  NOT NULL AUTO_INCREMENT,
  username VARCHAR (16) NOT NULL,
  password VARCHAR (40) NOT NULL,
  email VARCHAR (40) NOT NULL,
  PRIMARY KEY(u_id)
) ENGINE = InnoDB;

CREATE TABLE `ect` (
  u_id INT UNSIGNED NOT NULL,
  u_group VARCHAR(6) NOT NULL,
  u_year VARCHAR(6) NOT NULL,
  PRIMARY KEY (u_id),
  FOREIGN KEY (u_id) REFERENCES userdata(u_id)
  ON UPDATE RESTRICT
  ON DELETE CASCADE
) ENGINE  = InnoDB;

При попытке выполнить сценарии создания таблицы ect,постоянно вылетает ошибка

#1005 - Can't create table 'thraph.ect' (errno: 150)
-
Foreign key constraint is incorrectly formed

А если даже удается сформировать запрос и создать таблицу,она не заполняется.
Знаю только:

Если оператор MySQL CREATE TABLE выдает ошибку с номером 1005, и в строке сообщения об ошибке присутствует ссылка на ошибку с номером 150, то произошел сбой создания таблицы из-за того, что ограничения внешнего ключа не были сформированы надлежащим образом.

Что значит надлежащим образом?Почему нет ничего вразумительного в интернете по этому поводу…Чем этот способ ему не нравиться)

Буду признателен если вы,хотябы частично решите мою проблему.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка создания вектора энтропии
  • Ошибка создания экземпляра класса сервлета tomcat