Ошибка при создании отношения внешнего ключа между не первичным ключом - PullRequest
0 голосов
/ 22 марта 2019

У меня есть две таблицы

CREATE TABLE `abc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ref_id` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ref_id_UNIQUE` (`ref_id`)
)

CREATE TABLE `xyz` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ref_id` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ref_id_UNIQUE` (`ref_id`)
 )

Я хочу установить связь между внешним ключом между ref_id xyz и ref_id abc. Но Mysql выдает ошибку 1215.

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Вы должны связать внешний ключ с первичными ключами . Я знаю, что MySQL разрешает отношения с внешним ключом ко всему с индексом Но правильной практикой является использование первичных ключей.

Итак, объявите таблицу следующим образом:

CREATE TABLE `xyz` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
  abc_id int DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ref_id_UNIQUE` (`abc_id`),
  ADD CONSTRAINT fk_xyz_abc FOREIGN KEY (abc_id) REFERENCES abc(id)
);

Если вы хотите ref_id для строки xyz, используйте JOIN для получения информации.

0 голосов
/ 22 марта 2019

Взгляните на ответ Гордона Линоффа, его предложение имеет смысл, хотя и не отвечает на вопрос.Так что может вызвать ошибку, когда вы намереваетесь создать отношение foreign key?Очевидная возможность - синтаксическая ошибка и опечатка, поэтому вам нужно будет проверить их и исправить любые такие проблемы.

Другая возможность состоит в том, что у вас есть несогласованность, то есть вы пытаетесь создать ограничение foreign key водин из ваших table с, но не все значения имеют точные совпадения.Итак, предполагая, что у вас есть таблицы Foo и Bar и вы намереваетесь Foo.lorem быть foreign key ссылкой на Bar.ipsum, тогда вам нужно будет убедиться, что все значения, которые у вас есть для Foo.lorem, имеют Bar.ipsum пара с точно такими же значениями (кроме null).Если это не так, то ваше ограничение foreign key не будет успешно создано.Найдите такие несоответствия:

select distinct Foo.lorem
from Foo
where not (Foo.lorem is null) and
not exists (select 1 from Bar where Foo.lorem = Bar.ipsum);

Внимательно прочитайте строки и убедитесь, что вы исправили любые такие Foo.lorem значения.

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