Внешний ключ отклонен, несмотря на то, что столбцы имеют разные типы данных - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь настроить две таблицы в базе данных и добавить внешний ключ между ними. Они объявлены следующим образом:

CREATE TABLE `clothing` (
  `name` varchar(26) COLLATE utf8_bin NOT NULL,
  `image` varchar(64) COLLATE utf8_bin NOT NULL,
  `localized_name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`localized_name`)),
  `main` varchar(18) COLLATE utf8_bin DEFAULT NULL,
  `stars` tinyint(3) unsigned NOT NULL,
  `id` tinyint(3) unsigned NOT NULL,
  `splatnet` smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`splatnet`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `abilities` (
  `name` varchar(18) COLLATE utf8_bin DEFAULT NULL,
  `image` varchar(48) COLLATE utf8_bin NOT NULL,
  `id` tinyint(3) unsigned NOT NULL,
  `localized_name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`localized_name`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Я хочу создать внешний ключ на clothing, который ссылается на abilities, с помощью следующей команды:

ALTER TABLE `abilities` ADD FOREIGN KEY (`name`) REFERENCES `clothing` (`main`);

Однако при попытке сделать это вызывает эту ошибку в ответ:

Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.
Can't create table `prismarine_rusted`.`abilities` (errno: 150 "Foreign key constraint is incorrectly formed")

Я не совсем уверен, что является причиной этого, и если я не пропускаю что-то действительно очевидно, main и name имеют одинаковый тип и, следовательно, должны иметь возможность связываться друг с другом через внешний ключ. Я использую MariaDB v10.4.12 с режимом SQL, установленным на TRADITIONAL.

Ответы [ 2 ]

4 голосов
/ 12 апреля 2020

Хотя используемые здесь столбцы внешнего и первичного ключей имеют одинаковый тип, вы пытаетесь сослаться на clothing.main, который не является уникальным столбцом или столбцом первичного ключа. Из документации MariaDB :

Ссылочные столбцы должны быть ПЕРВИЧНЫМ КЛЮЧОМ или УНИКАЛЬНЫМ индексом.

Обратите внимание, что это отличается от InnoDB в MySQL, где столбец внешнего ключа может фактически ссылаться на неуникальный столбец в другой таблице.

Один из способов исправить эту ошибку - сделать clothing.main уникальным столбцом:

ALTER TABLE clothing ADD UNIQUE (main);

Обратите внимание, что выполнение этого может иметь логический смысл, только если значения в main уже уникальны. Если нет, то, возможно, вам придется пересмотреть свою модель данных.

0 голосов
/ 12 апреля 2020

Это может быть связано с тем, что в файле abilities.name есть значение, которому нет совпадения в указанной таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...