Подтвердить что ты не робот

Добавление внешнего ключа на несколько столбцов

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

Вот что я делаю:

CREATE TABLE test2 (
  ID INT NOT NULL AUTO_INCREMENT,  
  col1 INT NOT NULL,
  col2 INT NOT NULL, 
  PRIMARY KEY (ID),
  CONSTRAINT fk FOREIGN KEY (col1, col2)
                REFERENCES test1(ID, ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT
) ENGINE=InnoDB;

Но я получаю

ERROR 1005 (HY000): Can't create table 'DB.test2' (errno: 150)

Если у меня есть только один столбец, таблица правильно создана.

Может ли кто-нибудь указать мне, где ошибка?

Спасибо п

4b9b3361

Ответ 1

Пробовал это здесь и получил ту же ошибку. Это работает, хотя:

CREATE TABLE test2 (
  ID INT NOT NULL AUTO_INCREMENT,  
  col1 INT NOT NULL,
  col2 INT NOT NULL, 
  PRIMARY KEY (ID),
  CONSTRAINT fk FOREIGN KEY (col1)
                REFERENCES test1(ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT,
  CONSTRAINT fk2 FOREIGN KEY (col2)
                REFERENCES test1(ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT

) ENGINE=InnoDB

Да, я знаю - ваш script должен работать (даже если это не имеет большого смысла). Тем не менее, я думаю, эта новая версия лучше.

Ответ 2

Проблема заключается в том, что вы указываете один и тот же родительский столбец дважды в том же внешнем ключе (например, (ID, ID)). Должно работать следующее:

Create Table Test1
    (
    PK1 int not null
    , PK2 int not null
    , Primary Key ( PK1, PK2 )
    )

Create Table Test2
    (
    Id int not null Auto_Increment
    , PK1 int not null
    , PK2 int not null
    , Primary Key ( ID )
    , Constraint FK_Test2
        Foreign Key ( PK1, PK2 )
        References Test1( PK1, PK2 )
    )

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