Код ошибки: 1005. Не удается создать таблицу '...' (номер ошибки: 150)
Я искал решение этой проблемы в Интернете и проверил вопросы SO, но в моем случае решение не помогло.
Я хочу создать внешний ключ от таблицы 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 на обеих таблицах (кодировка и сопоставление). Но не смог найти решение этой проблемы. У кого-нибудь есть идеи? Заранее спасибо.
РЕДАКТИРОВАТЬ: Вот таблица metal_kod:
METAL_KODU varchar(4) NO PRI
DURUM bit(1) NO
METAL_ISMI varchar(30) NO
AYAR_YOGUNLUK smallint(6) YES 100
14 ответов
Код ошибки: 1005 - в вашем коде неверная ссылка на первичный ключ
обычно это связано с тем, что эталонного поля FK не существует. возможно, у вас ошибка опечатки, или проверьте, чтобы она была такой же, или есть несоответствие типа поля. FK-связанные поля должны точно соответствовать определениям.
Некоторые известные причины могут быть:
- Два ключевых поля типа и / или размера не совпадают точно. Например, если один
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 одинаковы как на уровне таблицы, так и на уровне отдельных полей для ключевых столбцов.
- У вас есть значение по умолчанию (т.е. default=0) в столбце внешнего ключа
- Одно из полей отношения является частью комбинированного (составного) ключа и не имеет собственного индивидуального индекса. Даже если у поля есть индекс как часть составного ключа, вы должны создать отдельный индекс только для этого ключевого поля, чтобы использовать его в ограничении.
- У вас есть синтаксическая ошибка в вашем
ALTER
заявление или вы опечатали одно из имен полей в отношениях - Имя вашего внешнего ключа превышает максимальную длину 64 символа.
для более подробной информации обратитесь: MySQL Error Number 1005 Не могу создать таблицу
Это также может произойти при экспорте базы данных с одного сервера на другой, и таблицы перечислены в алфавитном порядке по умолчанию.
Итак, ваша первая таблица может иметь внешний ключ другой таблицы, которая еще не создана. В таких случаях отключите foreign_key_checks и создайте базу данных.
Просто добавьте следующее в ваш скрипт:
SET FOREIGN_KEY_CHECKS=0;
и это сработает.
Я знаю, что это немного поздний ответ, но я подумал, что это может быть полезно для кого-то.
Иногда это происходит из-за того, что основная таблица удалена (возможно, путем отключения foreign_key_checks), но внешний ключ CONSTRAINT все еще существует в других таблицах. В моем случае я бросил стол и попытался воссоздать его, но он выдал ту же ошибку для меня.
Поэтому попробуйте удалить все внешние ключи CONSTRAINT из всех таблиц, если таковые имеются, а затем обновите или создайте таблицу.
Очень часто это происходит, когда внешний ключ и ссылочный ключ не имеют одинаковый тип или одинаковую длину
Код ошибки: 1005
Здравствуйте, я добавляю этот ответ, чтобы любой, кто сталкивался с подобной проблемой, такой как я, мог получить пользу от этого ответа. Поверьте мне, это можно упустить из виду) (на это, возможно, уже был дан ответ, и если да, то извините меня)
У меня была похожая проблема, поэтому вот несколько вещей, которые я попробовал (не в любом порядке, кроме решения:))
- Изменены имена внешних ключей (не работает)
- Уменьшена длина внешнего ключа
- Проверены типы данных (черт возьми, ничего плохого)
- Проверьте индексы
- Проверьте параметры сортировки (все хорошо, черт возьми снова)
- Усеченный стол, бесполезный
- Уронил стол и пересоздал
- Попытался увидеть, создается ли какая-либо круговая ссылка --- все хорошо
9. Наконец, я увидел, что у меня открыто два редактора. Один, который в PHPStorm (jetbrains) и другой MySQL верстак. Кажется, что инструментальные средства PHPStorm / SQL создают какую-то блокировку редактирования. Я закрыл PHPStorm просто чтобы проверить, была ли блокировка (это могло быть наоборот). Это решило мою проблему. Надеюсь, что это помогает кому-то, имеющему подобную проблему.
У меня было то же самое сообщение об ошибке. Наконец, я понял, что неправильно написал имя таблицы в команде:
ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);
против
ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);
Интересно, почему MySQL не может сказать, что такой таблицы не существует...
Внешний ключ должен иметь тот же тип, что и первичный ключ, на который он ссылается. Для примера имеет тип "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';
У меня была похожая ошибка. Проблема была связана с тем, что у дочерней и родительской таблиц не было одинакового набора символов и параметров сортировки. Это можно исправить, добавив 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 означает, что отсутствует какой-либо код.
Проверьте , что обе таблицы имеют одинаковую схему InnoDB MyISAM. Я сделал их все одинаково в моем случае InnoDB и работал
В моем случае это произошло, когда одна таблица - InnoB, а другая - MyISAM. Изменение движка одной таблицы через MySQL Workbench решает для меня.
Моей проблемы не было в списке, это была какая-то глупость..... Таблица с FK
поскольку ПК был составным PK
который был объявлен так: первичный ключ (CNPJ
, CEP
) Я хотел, чтобы поле CEP было FK
в другой таблице, и я застрял в этой ошибке, мораль истории просто перевернула приведенный выше код для первичного ключа (CEP
, CNPJ
) и это сработало. Получите чаевые своим друзьям.
MyISAM был только что упомянут. Просто попробуйте добавить ENGINE=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 ;
Это произошло в моем случае, потому что имя таблицы, на которую ссылаются в объявлении ограничения, неверно (я забыл верхний регистр в имени таблицы)
ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Надеюсь, это поможет.
Также проверьте справочную таблицу! Вы можете по ошибке использовать другое поле в той же таблице