2009-11-17 7 views
68

Мне нужно создать db с двумя таблицами в mysql, но сбой скрипта с errno 150 (проблема с внешним ключом). Я дважды проверил поля внешнего ключа, чтобы они были одинаковыми на обеих таблицах, и я не могу найти никаких ошибок.Mysql. Не удается создать таблицу errno 150

Вот сценарий:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

DROP SCHEMA IF EXISTS `testdb`; 
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; 
USE `testdb`; 

DROP TABLE IF EXISTS `testdb`.`table1` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 



DROP TABLE IF EXISTS `testdb`.`table2` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table2` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `field1` VARCHAR(50) NULL , 
    `date` DATE NULL , 
    `cnt` INT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `FK_table2_table1` (`field1` ASC) , 
    CONSTRAINT `FK_table2_table1` 
    FOREIGN KEY (`field1`) 
    REFERENCES `testdb`.`table1` (`field1`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

Я пробовал в Windows, и Ubuntu с разными версиями Mysql и не работал.

Любые идеи? Большое спасибо.

+9

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

+2

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

ответ

54

table1.field1 не имеет указаний, определенных на нем.

Необходимо установить ограничение FOREIGN KEY на field1.

С этим:

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    KEY ix_table1_field1 (field1), 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

Все должны работать, как ожидалось.

+5

Согласно руководству, он не должен быть УНИКАЛЬНЫМ. –

+0

'@Vilx:' правый и 15 символов. – Quassnoi

+17

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

13

В зависимости от версии MySQL вам может потребоваться сначала создать индекс на table1.field1.

1

Если ничего не работает, попробуйте следующее:

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

0

Сначала создайте основные/родительские таблицы, а затем создайте свои таблицы деталей/дочерних элементов.

5

Опцион (в зависимости от случая) будет отключить проверку целостности MySQL:

SET FOREIGN_KEY_CHECKS = 0; 
0

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

0

Если у кого-то все еще есть проблемы с этим, я пробовал все решения выше (кроме SET FOREIGN_KEY_CHECKS), и ничего не работало. Проблема заключалась в том, что когда вы ссылаетесь на первую таблицу, некоторые базы данных чувствительны к регистру для имен таблиц. Я думаю, что это странно, поскольку я никогда не видел этого раньше в MySQL, Oracle, и теперь это произошло для меня на MariaDB.

Например:

Создать таблицу, если не существует CADASTRO_MAQUINAS ( Id VARCHAR (16), Первичный ключ (Id) );

Создать таблицу, если не существует INFOS ( Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas внешнего ключа (Id_Maquina) ссылается CADASTRO_MAQUINAS (Id) );

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

0

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

50

При работе с MySQL Workbench и MySQL 5.5.27 я столкнулся с подобной проблемой. В моем случае проблема была связана с полями типа INT. Ошибочно в одной таблице был INT UNSIGNED, а в справочной таблице - INT.

+11

Это была моя проблема. Спасибо! –

6

Другой намек:

Даже если ваши типы данных, как представляется, то же самое - в моем случае обе колонки были VARCHAR(50) - это не достаточно.

Вам также необходимо убедиться, что оба столбца имеют одинаковые COLLATION.

8

Один из ответов здесь предлагает отключить проверку целостности внешнего ключа. Это плохая идея. Есть два возможных виновники здесь: Тип

  • данных несоответствие между ссылочным первичным ключом и внешним ключом ссылкой
  • индексов. Любые внешние ключи, которые вы указали, должны быть NOT NULL
+1

для меня это было несоответствие типа данных ... спасибо за помощь! – sbditto85

+0

Аргумент NOT NULL не применяется к моему Mysql 5.5 –

0

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

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

1, Проверьте случае колонны 2 Проверить COLLATION Колонный 3, Проверьте, есть ли ключ создан в обеих таблицах для столбца (Unique, Primary)

5

Еще одна причина, хотя и немного похожи другим: я имел в виду таблицу, в которой вместо InnoDB появился движок MyISAM.

0

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

Так что это может произойти из-за несоответствия между двумя базами данных/поля определения пытаются проверить:

Field Type 
Field Collation 
Table Engine 
5

MySQL будет также бросить эту ошибку, если ваш опечаток имя ссылающейся таблицы. Я вытащил свои волосы на некоторое время, пока не понял, что пропустил письмо в foreign key (column1) references mistyped_table(column1)

+0

В некоторых ситуациях дело (имя таблицы) имеет значение - в некоторых нет. Например, мой скрипт работал на mysql на OSX, но на linux у меня была эта проблема errno: 150. Дело было моей проблемой. – prule

+0

Точно так же у меня был 'FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE', но в таблице' user' нет поля 'id' - он был вызван' user_id'! Итак, в приведенном выше я изменил 'user (id)' на 'user (user_id)', и все было хорошо во вселенной снова ... пока. – elimisteve

0

Для меня проблема заключалась в использовании CONSTRAINT в запросе CREATE TABLE.

0

Вы также можете столкнуться с такой же ошибкой при попытке ссылаться на составной ключ в вашем внешнем ключе.

Например:

CREATE TABLE `article` (
    `id` int(10) unsigned NOT NULL, 
    `type` enum('X','Y','Z') NOT NULL, 
    PRIMARY KEY (`id`,`type`) 
) ENGINE InnoDB; 

CREATE TABLE `t1` (
    `user_id` int(10) unsigned NOT NULL, 
    `type` enum('X','Y','Z') NOT NULL, 
    `article_id` int(10) unsigned NOT NULL, 
    CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB 

В этом случае важно использовать article_id и поле типа в определении FK в том же порядке, как они появляются в определении PRIMARY KEY статье таблицы.

0

В моем случае, вероятно, была ошибка сервера, отбрасывающая таблицу с тем же именем. Сбрасывая всю шимсу и воссоздавая ее, она решила проблему.

0

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

Оказалось InnoDB был сломан, см: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to-a?lq=1

0

Если вы работаете на MySQL Workbench, и вы получите эту ошибку для таблицы отношений может быть быстро исправить для вас: просто удалить его и позволить MySQL Workbench Создать заново это для вас. Затем скопируйте sql. Исправлена ​​проблема с errno 150.

0

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

0

Когда у меня возникла эта проблема, это было потому, что я установил идентификатор в первой таблице unsigned, тогда как внешнего ключа во второй таблице не было. Сделав их как unsigned, он исправил это для меня.

Смежные вопросы