MySQL - ошибка: 150 «ограничение внешнего ключа сформировано неправильно») - PullRequest
0 голосов
/ 22 октября 2019

У меня возникла странная проблема, которую я не могу решить после просмотра десятков сообщений на форуме и моих локальных книг по SQL.

У меня есть две таблицы, и я хочу добавить внешний ключ к одной из них. Внешний ключ и первичный ключ имеют один и тот же тип данных и кодировку, и все же я вообще не могу добавить внешний ключ.

addon_account:

1 - id int (11) <- Первичный ключ </p>

2 - имя varchar (60) <- первичный ключ </p>

3 - метка varchar (255)

4 - общий int (11)

addon_account_data:

1 - id int (11) <- первичный ключ </p>

2 - имя_счета varchar (60) <- первичный ключ </p>

3 - двойные деньги

4 - владелец varchar ()

Выполненный мной запрос:

ALTER TABLE `addon_account_data` ADD FOREIGN KEY (`account_name`) REFERENCES `addon_account`(`name`) ON DELETE RESTRICT ON UPDATE RESTRICT;

Не удается заставить его работать. Все время выкидывает одну и ту же проблему.

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Вы создаете внешний ключ на addon_account_data(account_name), который ссылается на addon_account(name). У вас есть составная первичная ссылочная таблица: addon_account(id, name).

Это не разрешено в MySQL, как объяснено в документации :

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

Возможные решения:

  • добавьте дополнительный столбец в ссылочной таблице: addon_account_data(account_id, account_name) и создайте составной первичный ключ для соответствующих столбцов в addon_account

  • создайте индекс для addon_account(name) (возможно, самое простое решение)

  • изменить порядок столбцов в первичном ключе указанной таблицы, например: addon_account(name, id) (вы можете сначала рассмотреть влияние, которое это может оказать на производительность)

0 голосов
/ 22 октября 2019

Я не совсем парень из MySQL, но:

Я считаю, что проблема в том, что вы ссылаетесь только на часть первичного ключа: ваша таблица addon_account имеет составной ключ PK (id, name).

Итак, чтобы ваши отношения работали, вам также необходимо добавить 'account_id' как часть внешнего ключа:

ALTER TABLE addon_account_data ADD FOREIGN KEY (account_id, account_name) REFERENCES addon_account(id, name)

Этот поток связан счто-то похожее.

Надеюсь, это поможет.

EDITED

Я установил экземпляр сервера MySQL на свою локальную машину ... (MySQL 8).

Я запустил приведенный ниже скрипт, и он сработал (давая предупреждения о том, что целочисленное отображение является устаревшей функцией, поэтому я бы рекомендовал его пропустить):

CREATE TABLE addon_account(
id INT(11) NOT NULL,
`name` VARCHAR(60) NOT NULL,
label VARCHAR(255),
shared INT(11),
CONSTRAINT pk_addon_account PRIMARY KEY(id, `name`));


CREATE TABLE addon_account_data (
id INT(11) NOT NULL,
account_name VARCHAR(60) NOT NULL,
account_id INT(11),
money DOUBLE,
`owner` VARCHAR(255),
CONSTRAINT pk_addon_account_data PRIMARY KEY(id, account_name),
CONSTRAINT fk_addon_account_account_data FOREIGN KEY(account_id, account_name)
    REFERENCES addon_account(id, `name`));

Не могли бы вы попробоватьи посмотреть, если это работает для вас?

Я не так хорошо знаком с MySQL.

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