Добавление внешнего ключа на несколько столбцов - PullRequest
10 голосов
/ 17 февраля 2011

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

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

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)

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

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

Спасибо

Ответы [ 2 ]

8 голосов
/ 17 февраля 2011

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

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

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

2 голосов
/ 17 февраля 2011

Возможно, проблема в том, что вы указали один и тот же родительский столбец дважды в одном и том же внешнем ключе (т. Е. (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, поскольку они представляют два независимых отношения.

...