Код ошибки: 1005. Невозможно создать таблицу "..." (errno: 150)
Я искал решение этой проблемы в Интернете и проверил вопросы, но ни одно из решений не сработало для моего случая.
Я хочу создать внешний ключ от таблицы sira_no к metal_kod.
ALTER TABLE sira_no
ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
REFERENCES metal_kod(METAL_KODU)
ON DELETE SET NULL
ON UPDATE SET NULL ;
Этот скрипт возвращает:
Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)
Я попытался добавить индекс в таблицу ссылок:
CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);
Я проверил METAL_KODU в обеих таблицах (charset и collation), но не смог найти решение этой проблемы. Как я могу решить эту проблему?
Вот таблица metal_kod:
METAL_KODU varchar(4) NO PRI
DURUM bit(1) NO
METAL_ISMI varchar(30) NO
AYAR_YOGUNLUK smallint(6) YES 100
Ответы
Ответ 1
Код ошибки: 1005 - в вашем коде неверная ссылка на первичный ключ
Обычно это связано с тем, что поле внешнего ключа, на которое ссылаются, не существует. Это может быть ошибка опечатки или проверка того, что она должна быть такой же, или несоответствие типа поля. Связанные с внешним ключом поля должны точно соответствовать определениям.
Некоторые известные причины могут быть:
- Два ключевых поля типа и/или размера не совпадают точно. Например, если один равен
INT(10)
то ключевым полем также должно быть INT(10)
а не INT(11)
или TINYINT
. Возможно, вы захотите подтвердить размер поля, используя SHOW
CREATE
TABLE
потому что Query Browser иногда визуально отображает только INTEGER
для INT(10)
и INT(11)
. Вы также должны проверить, что один не SIGNED
а другой UNSIGNED
. Они оба должны быть абсолютно одинаковыми. - Одно из ключевых полей, на которое вы пытаетесь сослаться, не имеет индекса и/или не является первичным ключом. Если одно из полей в связи не является первичным ключом, необходимо создать индекс для этого поля.
- Имя внешнего ключа является дубликатом уже существующего ключа. Убедитесь, что имя вашего внешнего ключа является уникальным в вашей базе данных. Просто добавьте несколько случайных символов в конец имени вашего ключа, чтобы проверить это.
- Одна или обе ваши таблицы являются таблицами
MyISAM
. Чтобы использовать внешние ключи, обе таблицы должны быть InnoDB
. (На самом деле, если обе таблицы MyISAM
вы не получите сообщение об ошибке - просто не создадите ключ.) В Query Browser вы можете указать тип таблицы. - Вы указали каскад
ON
DELETE
SET
NULL
, но для соответствующего ключевого поля установлено значение NOT
NULL
. Это можно исправить, изменив каскад или установив в поле значения NULL
. - Убедитесь, что параметры Charset и Collate одинаковы как на уровне таблицы, так и на уровне отдельных полей для ключевых столбцов.
- У вас есть значение по умолчанию (то есть по умолчанию = 0) в столбце внешнего ключа
- Одно из полей отношения является частью комбинированного (составного) ключа и не имеет своего собственного индивидуального индекса. Даже если у поля есть индекс как часть составного ключа, вы должны создать отдельный индекс только для этого ключевого поля, чтобы использовать его в ограничении.
- У вас есть синтаксическая ошибка в вашем операторе
ALTER
или вы неправильно набрали одно из имен полей в отношении - Имя вашего внешнего ключа превышает максимальную длину в 64 символа.
Для получения дополнительной информации обратитесь к: Ошибка MySQL 1005 Не удается создать таблицу
Ответ 2
Это также может произойти при экспорте вашей базы данных с одного сервера на другой, а таблицы перечислены в алфавитном порядке по умолчанию.
Итак, ваша первая таблица может иметь внешний ключ другой таблицы, которая еще не создана. В таких случаях отключите foreign_key_checks и создайте базу данных.
Просто добавьте следующее в свой script:
SET FOREIGN_KEY_CHECKS=0;
и он будет работать.
Ответ 3
Очень часто это происходит, когда внешний ключ и ссылочный ключ не имеют одинаковый тип или одинаковую длину.
Ответ 4
Иногда это происходит из-за того, что основная таблица удаляется (возможно, путем отключения foreign_key_checks), но внешний ключ CONSTRAINT все еще существует в других таблицах. В моем случае я бросил стол и попытался воссоздать его, но он выдал ту же ошибку для меня.
Поэтому попробуйте удалить все ограничения внешнего ключа из всех таблиц, если таковые имеются, а затем обновите или создайте таблицу.
Ответ 5
Код ошибки: 1005
У меня была похожая проблема, поэтому вот несколько вещей, которые я попробовал (не в любом порядке, кроме решения :))
- Изменены имена внешних ключей (это не сработало)
- Уменьшена длина внешнего ключа
- Проверены типы данных (черт возьми, ничего плохого)
- Проверьте индексы
- Проверьте параметры сортировки (все хорошо, черт возьми снова)
- Усеченный стол, бесполезный
- Уронил стол и пересоздал
- Попытался увидеть, создается ли какая-либо круговая ссылка --- все хорошо
-
Наконец, я увидел, что у меня открыто два редактора. Один, который в PhpStorm (JetBrains) и другой MySQL верстак. Кажется, что PhpStorm/MySQL Workbench создает какую-то блокировку редактирования.
Я закрыл PhpStorm просто чтобы проверить, была ли блокировка (это могло быть наоборот). Это решило мою проблему.
Ответ 6
У меня была аналогичная ошибка. Проблема связана с дочерней и родительской таблицами, которые не имеют одинаковой кодировки и сортировки. Это можно исправить добавлением ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
... в операторе SQL означает, что есть недостающий код.
Ответ 7
У меня было то же самое сообщение об ошибке. В конце концов я понял, что неправильно написал имя таблицы в команде:
ALTER TABLE 'users' ADD FOREIGN KEY (country_id) REFERENCES country (id);
против
ALTER TABLE 'users' ADD FOREIGN KEY (country_id) REFERENCES countries (id);
Интересно, почему MySQL не может сказать, что такой таблицы не существует...
Ответ 8
Внешний ключ должен иметь тот же тип, что и первичный ключ, на который он ссылается. Для примера имеет тип "INT UNSIGNED NOT NULL", для ключа foreing также необходимо "INT UNSIGNED NOT NULL"
CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';
Ответ 9
Это произошло в моем случае, потому что имя таблицы, на которую ссылаются в объявлении ограничения, было неверным (я забыл верхний регистр в имени таблицы):
ALTER TABLE 'Window' ADD CONSTRAINT 'Windows_ibfk_1' FOREIGN KEY ('WallId') REFERENCES 'Wall' ('id') ON DELETE CASCADE ON UPDATE CASCADE;
Ответ 10
MyISAM только что упоминалось. Просто попробуйте добавить ДВИГАТЕЛЬ = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; в конце инструкции, предполагая, что ваши другие таблицы были созданы с помощью MyISAM.
CREATE TABLE IF NOT EXISTS `tablename` (
`key` bigint(20) NOT NULL AUTO_INCREMENT,
FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Ответ 11
В моем случае это произошло, когда одна таблица InnoB, а другая - MyISAM. Изменение механизма одной таблицы через MySQL Workbench решает для меня.
Ответ 12
Проверьте, что обе таблицы имеют одинаковую схему InnoDB MyISAM. Я сделал их все то же самое в моем случае InnoDB и работал