Mysql. Не могу создать таблицу errno 150
Я должен создать БД с 2 таблицами в MySQL, но сценарий завершается с ошибкой 150 (проблема с внешним ключом). Я дважды проверил поля внешнего ключа на одинаковые в обеих таблицах и не могу найти никаких ошибок.
Вот сценарий:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@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 SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Я пробовал это в Windows и Ubuntu с разными версиями Mysql и не работал.
Есть идеи? Большое спасибо.
22 ответа
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;
Тогда все должно работать как положено.
При работе с MySQL Workbench и MySQL 5.5.27 я столкнулся с подобной проблемой. В моем случае проблема была с полями типа INT. Ошибочно в одной таблице это было INT UNSIGNED и в таблице ссылок это было INT.
В зависимости от версии MySQL вам может понадобиться сначала создать индекс для table1.field1.
Один из ответов здесь предлагает отключить проверку целостности внешнего ключа. Это плохая идея. Здесь есть два вероятных виновника:
- Несоответствие типов данных между ссылочным первичным ключом и ссылочным внешним ключом
- Индексы. Любые внешние ключи, которые вы индексировали, должны быть NOT NULL
Еще один намек:
Даже когда ваши типы данных кажутся одинаковыми - в моем случае оба столбца VARCHAR(50)
- этого недостаточно.
Вы также должны убедиться, что оба столбца имеют одинаковые COLLATION
,
Опция (в зависимости от случая) будет отключать проверку целостности mysql:
SET FOREIGN_KEY_CHECKS = 0;
MySQL также выдаст эту ошибку, если вы неправильно набрали имя ссылающейся таблицы. Я выдернул волосы на некоторое время, пока не понял, что пропустил письмо в foreign key (column1) references mistyped_table(column1)
Еще одна причина, хотя и немного похожая на другие: я имел в виду таблицу, в которой вместо InnoDB был установлен механизм MyISAM.
Я получил эту ошибку при попытке использовать внешний ключ для ссылки на неуникальное поле. (что, по- видимому, не допускается)
Если ничего не работает, попробуйте это:
Имя внешнего ключа является дубликатом уже существующего ключа. Убедитесь, что имя вашего внешнего ключа является уникальным в вашей базе данных. Просто добавьте несколько случайных символов в конец имени вашего ключа, чтобы проверить это.
В очень странных случаях ваша база данных может быть повреждена. В моем случае у меня не было никаких внешних ключей на столе, и помогла только переименование таблицы или изменение движка.
Оказалось, что innoDB был сломан, см.: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to-a?lq=1 while-tried-to- стоит ? LQ = 1
Вы также можете столкнуться с той же ошибкой при попытке ссылки на составной ключ в вашем внешнем ключе.
Например:
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 и поле type в определении FK в том же порядке, в котором они указаны в определении PRIMARY KEY таблицы товаров.
Всегда сначала создавайте основные / родительские таблицы, а затем создавайте подробные / дочерние таблицы.
В случае, если у кого-то все еще есть проблемы с этим, я попробовал все решения выше (кроме 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, я получу эту ошибку.
В моем случае, вероятно, была ошибка сервера, удаляющая таблицу с тем же именем. Удаление всей шкемы и воссоздание ее решило проблему.
Для меня проблема была с использованием CONSTRAINT
в CREATE TABLE
запрос.
В моем случае я получил старое определение таблицы MyISAM в одной из таблиц и, очевидно, не смог сделать внешний ключ к нему из другой таблицы. Может быть, это поможет кому-то.
Так что это может произойти из-за несоответствий между двумя определениями баз данных / полей, попробуйте проверить:
Field Type
Field Collation
Table Engine
В моем случае одна таблица использовала ограничения внешнего ключа для другой таблицы, которая еще не существовала. Это происходило из-за большого make-файла, так что это было не так очевидно, как я ожидал.
Когда у меня возникла эта проблема, это было потому, что я установил идентификатор в первой таблице, чтобы unsigned
тогда как внешнего ключа во второй таблице не было. Делая их обоих unsigned
исправил это для меня.
Я использовал MySQL workBench
, Проблема в том, что вы не можете использовать то же самое foreign key name
они должны быть unique
, Таким образом, если несколько таблиц будут ссылаться на один и тот же внешний ключ, каждый раз unique
имя дано.
Если вы работаете в MySQL Workbench и получаете эту ошибку для таблицы отношений, может быть быстрое решение для вас: просто удалите ее и позвольте MySQL Workbench воссоздать ее для вас. Затем скопируйте sql. Исправлена моя ошибка errno 150.
У меня была похожая ошибка на одной из моих таблиц. Если флажок Collation был разным, это сработало, когда оба столбца изменились на один и тот же тип сортировки.
После прочтения большей части предложенного решения здесь. Я просто подумал, что было бы полезно, если бы я просто перечислил все возможности, которые могут вызвать эту ошибку.
1, проверьте CASE столбца 2, проверьте COLLATION столбцов 3, проверьте, существует ли ключ, созданный в обеих таблицах для столбца (уникальный, основной)