Невозможно установить sh несколько внешних ключей на mysql, специально протестировано на mariaDB и w3schools online mysql - PullRequest
0 голосов
/ 24 февраля 2020

Я собирался создать две таблицы (1-я таблица: fooditem_tbl и 2-я таблица: orderitem_tbl). Я планировал создать 2 внешних ключа (ITEM_NAME, UNIT_PRICE) на 2-й таблице. Я не смог выполнить запрос 2-й таблицы (orderitem_tbl) из-за ошибки, которая находится рядом с "INDEX". Я продолжал смотреть на свой запрос, и я до сих пор не знаю, в чем причина ошибки.

Моя первая таблица, эта работает

CREATE TABLE FOODITEM_TBL
(ITEM_ID         INT AUTO_INCREMENT,
ITEM_NAME        VARCHAR(50)  UNIQUE,
UNIT_PRICE       DOUBLE UNSIGNED,
ITEM_QUANTITY    INT UNSIGNED,
IN_STOCK         BOOLEAN,
PRIMARY KEY (ITEM_ID, ITEM_NAME, UNIT_PRICE));

2-я таблица, которая ниже не удается создать

CREATE TABLE ORDERITEM_TBL(
ORDER_ID         INT AUTO_INCREMENT,
ITEM_NAME        VARCHAR(50) UNIQUE,
UNIT_PRICE       DOUBLE UNSIGNED,
ITEM_QUANTITY    INT UNSIGNED,
CUSTOMER_NAME    VARCHAR(50),
ADDRESS          VARCHAR(50),
CONTACT_NUMBER   VARCHAR(50),
PRIMARY KEY (ORDER_ID),
INDEX (ITEM_NAME,UNIT_PRICE),
FOREIGN KEY (ITEM_NAME,UNIT_PRICE) REFERENCES 
  FOODITEM_TBL(ITEM_NAME,UNIT_PRICE)
) ENGINE = InnoDB;

PS Пожалуйста, помогите

Q: Что является причиной ошибки? Как я могу это исправить?

1 Ответ

0 голосов
/ 24 февраля 2020

Для InnoDB должен быть индекс на целевой таблице, на целевом столбце (столбцах). Типы данных столбцов со ссылками на внешние ключи должны соответствовать типам данных целевых столбцов.

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

CREATE UNIQUE INDEX `FOODITEM_TBL_UX3` ON `FOODITEM_TBL` (`ITEM_NAME`, `UNIT_PRICE`) ;

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


Лично я бы избежал плавающего точечные типы данных (например, DOUBLE) для столбцов, участвующих в ограничениях внешнего ключа.

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