【问题标题】:Adding foreign key on multiple columns在多列上添加外键
【发布时间】:2011-06-28 18:02:41
【问题描述】:

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

这是我的工作:

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

【问题讨论】:

  • @Cyber​​nate:抱歉,忘记说明了,ID是test1的主键,与col1和col2(INT)的类型相同。还有一堆其他列(但这不重要)并且没有设置其他约束或索引。
  • 您是否尝试过此操作而不指定级联更新或删除?
  • @Thomas:是的,我尝试省略 ON UPDATE 和 ON DELETE 但它不会改变结果...

标签: mysql foreign-keys mysql-error-1005


【解决方案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

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

【讨论】:

  • @nico - 它之所以有效,是因为您与同一个父表列有两个独立的关系。这样想,只有当父表键是多列键时,您才会使用原始帖子中的语法。如果父表列是单列,那么对于要引用该父表列的每个子列,您必须创建单独的外键约束。
  • @Thomas:好的,现在我明白了!实际上想想,这很有意义。谢谢。
【解决方案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 所示,因为它们代表两个独立的关系。

【讨论】:

  • 好吧,但是我在 Test1 中没有复合主键... Test2 中的两列都应该指向 Test1 中的相同(唯一)主键。
  • @nico - 那么它们代表两个独立的关系并且需要两个外键约束。当父列是多列键时,您只会使用 OP 中的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
相关资源
最近更新 更多