2011-02-16 90 views
10

我试图创建一个表的两列的外键指向另一个表的同一列,但我似乎得到一个错误......添加外键上多列

这里是我做的:

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)

如果我只有一列,但是,正确地创建表。

有人能指出我错误在哪里吗?

感谢 ň

+0

test1的DDL是什么? – Chandu 2011-02-16 23:34:31

+0

@Cyber​​nate:对不起,忘了指定,ID是test1的主键,与col1和col2(INT)的类型相同。还有一堆其他的列(但这不重要),也没有设置其他约束或索引。 – nico 2011-02-16 23:37:04

+0

您是否在未指定级联更新或删除的情况下尝试此操作? – Thomas 2011-02-17 00:07:19

回答

8

在这里尝试过了,得到了同样的错误。这工作虽然:

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

问题可能是您在同一个外键(即(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那些代表了两个独立关系。