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)

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

有人可以向我指出错误在哪里吗?

谢谢n

4

2 回答 2

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

是的,我知道 - 你的脚本应该可以工作(即使它似乎没有多大意义)。然而,我想这个新版本更好。

于 2011-02-16T23:53:50.323 回答
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 所示,因为它们代表两个独立的关系。

于 2011-02-17T00:10:52.060 回答