Подтвердить что ты не робот

Неправильно сформировано ограничение внешнего ключа?

Я получил этот аргумент при создании таблицы: неверно сформировано ограничение внешнего ключа.

{create table comment(
Comment_ID int UNSIGNED AUTO_INCREMENT not null,
User_1 varchar(50) not null,
Note_ID int(11) UNSIGNED not null,
PRIMARY key(Comment_ID),
  CONSTRAINT `fk_1` FOREIGN KEY (`User_1`) REFERENCES `user` (`Dev_ID`),
  CONSTRAINT `fk_2` FOREIGN KEY (`User_2`) REFERENCES `user` (`Dev_ID`),
  CONSTRAINT `fk_3` FOREIGN KEY (`Note_ID`) REFERENCES `note`(`Note_ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
}

это нормально, когда я удаляю fk_3
это моя таблица примечаний

{ 
CREATE TABLE `note` (
 `Dev_ID` varchar(50) NOT NULL,
  `Note_ID` int(11) UNSIGNED NOT NULL,
  `Title` varchar(200) NOT NULL,
  `Time` datetime NOT NULL,
  `Mood` int(11) NOT NULL,
  `Body` varchar(3000) NOT NULL,
  `Visible` tinyint(1) NOT NULL DEFAULT '1',
  `Share` tinyint(1) NOT NULL DEFAULT '0',
  `Update` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Dev_ID`,`Note_ID`),
  CONSTRAINT `fk_note_user` FOREIGN KEY (`Dev_ID`) REFERENCES `user` (`Dev_ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
}

Спасибо за помощь!

4b9b3361

Ответ 1

Это потому, что первичный ключ таблицы notes (Dev_ID,Note_ID), но вы ссылаетесь только на один из этих столбцов (Note_ID) в своем ограничении.

Ограничение FK должно всегда состоять из всех столбцов PK.

Ответ 2

Также убедитесь, что обе таблицы являются innoDB.

Ответ 3

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

Ответ 4

Еще одно дополнение: кодировки полей должны совпадать.

В ссылочной таблице у меня был ascii в качестве кодировки по умолчанию: DEFAULT CHARSET=ascii сообщалось show create table. Я попытался создать таблицу реферирования с помощью DEFAULT CHARSET=utf, и я получил "Внешнее ограничение ключа неверно сформировано".

После того, как я изменил это на DEFAULT CHARSET=ascii в новой таблице (ссылка на нее), она была успешно создана.