Как исправить ограничение внешнего ключа при попытке ссылаться на два первичных ключа из одной таблицы?

#mysql #sql

#mysql #sql

Вопрос:

Ошибка:

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

Проблема:

MySQL workbench отказывается разрешить мне создать таблицу, которая ссылается на два первичных ключа другой таблицы. Это просто выдает мне код ошибки: 1215. Не удается добавить ограничение внешнего ключа.

Я пытался:

Изменение типов атрибутов с datetime на varchar(). Изменение имен атрибутов. Проверено написание 5 раз. Ссылка только на один ключ работает нормально, но мне нужны оба.

Код проблемы (таблица SQL):

 CREATE TABLE IF NOT EXISTS TestInformation2
(
WorkOrder varchar(15),                              
Date datetime,                                  
TechnicianID smallint,
Primary key (WorkOrder, Date)
) ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS TestBridge2
(
TestBridgeID integer Primary key,
WorkOrder varchar(15),      
Date datetime,                  
Foreign key (WorkOrder) references TestInformation (WorkOrder),
Foreign key (Date) references TestInformation (Date)
) ENGINE = InnoDB;
  

Результат, который я хочу:

Создайте таблицу ‘TestBridge’, которая имеет два атрибута внешнего ключа: WorkOrder и Date

Ответ №1:

Это должен быть один составной внешний ключ, а не два:

 CREATE TABLE `TestBridge2` (
    `TestBridgeID` INTEGER NOT NULL,
    `WorkOrder` VARCHAR(15),
    `Date` DATETIME,
    PRIMARY KEY (`TestBridgeID`),
    CONSTRAINT FOREIGN KEY (`WorkOrder`, `Date`) REFERENCES `TestInformation2` (`WorkOrder`, `Date`)
)
ENGINE=InnoDB;

  

Комментарии:

1. Спасибо, это работает, не могли бы вы объяснить, почему это необходимо сделать именно так? Также что делает ОГРАНИЧЕНИЕ в этом примере?

2. FK должен ссылаться на PK, а ваш PK составной, поэтому FK также должен быть составным. Синтаксис зависит от руководства: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html . Я не вводил команду вручную (так проще допустить опечатку), я создал таблицы с помощью ваших команд, затем использовал свой SQL-клиент (HeidiSQL) для создания FK, а затем скопировал / вставил сюда команду create table с небольшими изменениями.

Ответ №2:

Для этого должен быть создан один внешний ключ, например:

 CREATE TABLE IF NOT EXISTS TestBridge2
(
TestBridgeID integer Primary key,
WorkOrder varchar(15),      
Date datetime,                  

Foreign key (WorkOrder, Date) references TestInformation2 (WorkOrder, Date)
) ENGINE = InnoDB;