Я пытаюсь перенаправить мою новую схему на мой db сервер, но я не могу понять, почему я получаю эту ошибку. Я пытался найти ответ здесь, но все, что я нашел, говорит, что нужно либо установить движок базы данных на Innodb, либо убедиться, что ключи, которые я пытаюсь использовать в качестве внешнего ключа, являются первичными ключами в своих собственных таблицах. Если я не ошибаюсь, я сделал и то, и другое. Вы можете предложить любую другую помощь?
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
`Clients_Case_Number` INT NOT NULL ,
`Staff_Emp_ID` INT NOT NULL ,
PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
CONSTRAINT `fk_Clients_has_Staff_Clients`
FOREIGN KEY (`Clients_Case_Number` )
REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Clients_has_Staff_Staff1`
FOREIGN KEY (`Staff_Emp_ID` )
REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
Выполнение SQL-сценария завершено: операторы: 7 успешных, 1 неудачный
Вот SQL для родительских таблиц.
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
`Case_Number` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
`Address` CHAR(50) NULL ,
`Phone_Number` INT(10) NULL ,
PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
`Emp_ID` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
Я предполагаю, что Clients.Case_Number
и/или Staff.Emp_ID
не являются точно таким же типом данных, как Clients_has_Staff.Clients_Case_Number
и Clients_has_Staff.Staff_Emp_ID
.
Возможно, столбцы в родительских таблицах являются INT UNSIGNED
?
Они должны иметь одинаковый тип данных в обеих таблицах.
Причины, по которым вы можете получить ошибку ограничения внешнего ключа:
Обновление:
ON DELETE SET NULL
, не определен как нулевой. Поэтому убедитесь, что столбец имеет значение null по умолчанию.Проверьте это.
Для других же ошибка не всегда может быть из-за несоответствия типа столбца, вы можете найти более подробную информацию о MySQL и чужеземном ключевые ошибки путем подачи команды
SHOW ENGINE INNODB STATUS;
вы можете найти ошибки в верхней части напечатано сообщение что-то вроде
не может найти индекс в указанной таблице, где ссылочные столбцы появляются в качестве первых столбцов и типы столбцов в таблице и таблицы не совпадают для ограничения.
Ошибка 1215 это очень раздражает. Пилюлька взрыва'ы ответ охватывает основы. Вы хотите, чтобы убедиться, чтобы начать оттуда. Однако, есть другое, гораздо более тонкие случаи, чтобы высматривать:
Например, когда вы пытаетесь связать первичные ключи из разных таблиц, убедитесь, чтобы предоставить правильный обновить
и опции удалить
. Е. Г.:
...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....
выиграл'т летать, потому что первичные ключи (например, идентификатор
) может'т быть нуль
.
Я уверен, есть еще больше, как и тонкие вопросы при добавлении подобных ограничений, который является, почему, когда приходят через ошибки ограничений, всегда убедитесь, ограничения и их последствия смысла в текущем контексте. Удачи с вашем ошибка 1215!
Проверьте параметры сортировки таблицы, используя показать состояние таблица
вы можете проверить информацию о таблицах, включая сверку.
Обе таблицы должны быть те же параметры.
Это'ы со мной случилось.
В моем случае, я удалил таблицу, используя набор FOREIGN_KEY_CHECKS=0, тогда
набор FOREIGN_KEY_CHECKS=1после. Когда я пошел, чтобы обновить таблицу, я получил
ошибка 1215. Проблема была еще одна таблица в базе данных, которая имеет внешний ключ для таблицы я удалил и был перегруз. Часть процесса перезарядки влекло за собой изменение типа данных для полей, которые сделали внешний ключ из другой таблицы недействительной, спровоцировав
ошибка 1215`. Я решил проблему, удалив и после перезагрузки другой таблицы с новым типом данных для соответствующих полей.
Тут есть подводный камень, который я испытал с "Ошибка 1215: не удается добавить ограничение внешнего ключа" при использовании фреймворк Laravel 4, особенно с JeffreyWay'ы что Laravel 4 генератора.
В фреймворк Laravel 4, Вы можете использовать JeffreyWay'генераторы S для того чтобы произвести миграцию файлов для создания таблиц один-на-один, что означает, что каждая миграция файл создается одна таблица. Вы должны быть осведомлены о том, что каждая миграция создается файл с меткой времени в имени файла, который дает заявки. Порядок генерации также порядок переноса операции при выполнении команды мастеровых командной строки "и на PHP ремесленника мигрировать". Таким образом, если файл запрашивает ограничение внешнего ключа, ссылающегося на ключ, который будет, но не сейчас, созданные в последний файл, ошибка 1215 это уволили. В таком случае, что вам нужно сделать, это изменить порядок переноса генерации файлов. Создавать новые файлы в нужном порядке, копию-в содержимое, затем удалить неупорядоченных старые файлы.
у меня была та же проблема, мое решение:
До:
CREATE TABLE EMPRES
( NoFilm smallint NOT NULL
PRIMARY KEY (NoFilm)
FOREIGN KEY (NoFilm) REFERENCES cassettes
);
Решение:
CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,
PRIMARY KEY (NoFilm)
);
Я надеюсь, что это'ы помочь ;)
У меня была та же проблема. Я решил сделать это:
Я создал следующую строку в
первичный ключ (идентификатор тип int(11) unsigned на не null типа AUTO_INCREMENT)
Я нашел это решение после попытки импортировать таблицу в мой конструктор схем. Если это работает для вас, дайте мне знать!
Удачи!
Фелипе Тércio
Еще одна причина: если вы используете на Удалить установить нуля
все столбцов, которые используются во внешнем ключе должен допускать значения null. Кто-то еще узнал об этом в этот вопрос.
От моего понимания, это бы'т быть проблемой в отношении целостности данных, но, похоже, что MySQL просто не'т поддерживать эту функцию (в 5.7).
Я не могу найти эту ошибку
CREATE TABLE RATING (
Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE,
PRIMARY KEY (Riv_Id, Mov_Id),
FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)
Я просто хотел добавить этот случай, а также для типа varchar
внешний ключ отношения. Последнюю неделю я провел, пытаясь разобраться в верстаке в MySQL 8.0 и наконец-то смог исправить ошибку.
Короткий Ответ: Набор символов и сортировки схема, таблица, столбец, ссылающейся таблице столбец ссылок и любых других таблиц, которые ссылаются на родительской таблице должны соответствовать.
Ответ:
У меня была типа enum в моем столе. Я изменил его на типа varchar
и я могу получить значения из справочной таблицы, так что я Дон'т придется изменить родительской таблице, чтобы добавить дополнительные опции. Этот внешний ключ отношения вроде простой, но я получил ошибку 1215. [Арвинд][1]'ы ответ и следующее [Ссылка][2] предложил использовать
SHOW ENGINE INNODB STATUS;
С помощью этой команды я получаю следующее подробное описание ошибки без дополнительной полезная информация
не может найти индекс в указанной таблице, где По указанным столбцам отображаются как первые столбцы, или колонки видах В таблицу и таблицы не совпадают для ограничения. заметим, что внутренней памяти типа enum и set изменилось в таблицы, созданные с >= InnoDB в-4.1.12, и таких колонн в старые таблицы нельзя ссылаться на такие столбцы в новые таблицы. и GT; пожалуйста, обратитесь к http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html для правильного определение внешнего ключа.
После чего я использовал набор FOREIGN_KEY_CHECKS=0;`, как полагают [Арвинд Bharadwaj][3] и ссылка [здесь][4]:
Это дало следующее сообщение об ошибке:
код ошибки: 1822. Не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения
На данный момент, я 'реинжиниринг'-Эд схему и я был в состоянии сделать связь по внешнему ключу в схеме ВЭС. О 'вперед инженер'-Инг, я получаю следующую ошибку:
1452 ошибка: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не
Когда я 'вперед инженер'-Эд по схеме ЭОР в новую схему, сценарий SQL побежал без проблем. Сравнение сгенерированного SQL от попыток вперед инженер, я обнаружил, что разница была кодировка и параметры сортировки. Родительская таблица, дочерняя таблица и две колонны utf8mb4
и utf8mb4_0900_ai_ci
сортировки, однако, еще один столбец в родительской таблице была ссылка с помощью кодировка = utf8 в , предложение COLLATE = utf8_bin ;` для другой дочерней таблице.
Для всей схемы, я изменил кодировку и параметры сортировки для всех таблиц и столбцов следующим образом:
CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
Это, наконец, решить мою проблему с ошибкой 1215.
Примечание:
Работает сортировка utf8mb4_general_ci
в MySQL верстак 5.0 или более поздней. Работает сортировка utf8mb4_0900_ai_ci
только для Workbench для MySQL 8.0 или выше. Я считаю, что одна из причин у меня были проблемы с набором символов и сортировки в связи с модернизацией инструментальных средств MySQL для 8.0 между ними. Вот [ссылка][5], что говорит больше об этой сортировке.
[1]: https://stackoverflow.com/a/24635096/6696819 и"она"в [2]: https://stackoverflow.com/questions/21526055/mysql-cannot-create-foreign-key-constraint "по ссылке"и [3]: https://stackoverflow.com/a/52620298/6696819 на "Арвинд Bharadwaj и" [4]: https://stackoverflow.com/questions/26329775/error-code-1822-failed-to-add-the-foreign-key-constaint-missing-index-for-con на "Здесь" [5]: https://www.monolune.com/what-is-the-utf8mb4_0900_ai_ci-collation/ "по ссылке"и
Для MySQL (InnoDB в) ... получить определения для столбцов, которые вы хотите перейти по ссылке
SELECT * FROM information_schema.columns WHERE
TABLE_NAME IN (tb_name','referenced_table_name') AND
COLUMN_NAME IN ('col_name','referenced_col_name')\G
сравните и убедитесь, оба определения столбцов
же COLUMN_TYPE(длина), же COLATION
может быть полезно, чтобы играть как
set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;
Я испытал эту ошибку по совсем другой причине. Я использовал MySQL в верстак 6.3 для создания моей модели данных (Леша). Я заметил, что когда порядок столбцов, указанных в определении внешнего ключа ограничение не будет соответствовать последовательность столбцов в таблице эта ошибка генерируется.
Это заняло у меня около 4 часов пробовать все остальное, но проверять это.
Теперь все работает хорошо и я могу вернуться к кодированию. :-)
Когда эта ошибка возникает потому, что в указанной таблице используется движок MyISAM двигателя этот ответ обеспечивает быстрый способ конвертировать ваши базы данных, чтобы все Джанго типовые таблицы использовать InnoDB: https://stackoverflow.com/a/15389961/2950621
Это'ы команды управления Django называется convert_to_innodb.
Ууу я только что получил его ! Это была смесь много уже выложили ответы (InnoDB в, неподписанные и т. п.). Одна вещь, я'т вижу, вот хоть это : если ваш ФК указывает на ПК, обеспечивает исходный столбец имеет значение, смысл. Например, если PK является mediumint(8), убедитесь, что исходный столбец содержит также mediumint(8). Это было частью проблемы для меня.