一次声明多个外键或单独声明它们之间有什么区别?

时间:2011-11-08 14:03:28

标签: mysql

我有一个名为Order_List的表,其中包含一个订单列表。每列包含一个外键,该外键引用订单表中订单的主键。我的问题是,声明这些外键的最佳方法是什么。使用MySQL Workbench我找到了两种方法......

方法#1

CREATE  TABLE IF NOT EXISTS 'mydb'.'Order_List' (
    'idOrder_List' INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    'orderID01' INT UNSIGNED NULL ,
    'orderID02' INT UNSIGNED NULL ,
    'orderID03' INT UNSIGNED NULL ,
    'orderID04' INT UNSIGNED NULL ,
    PRIMARY KEY ('idOrder_List') ,
    INDEX 'fk_Order_List_1' ('orderID01' ASC, 'orderID02' ASC, 'orderID03' ASC, 'orderID04' ASC) ,
    CONSTRAINT 'fk_Order_List_1'
      FOREIGN KEY ('orderID01' , 'orderID02' , 'orderID03' , 'orderID04' )
      REFERENCES 'mydb'.'Order' ('idOrder' , 'idOrder' , 'idOrder' , 'idOrder' )
      ON DELETE NO ACTION
      ON UPDATE NO ACTION)
    ENGINE = InnoDB

方法#2

  CREATE  TABLE IF NOT EXISTS 'mydb'.'Order_List' (
    'idOrder_List' INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    'orderID01' INT UNSIGNED NULL ,
    'orderID02' INT UNSIGNED NULL ,
    'orderID03' INT UNSIGNED NULL ,
    'orderID04' INT UNSIGNED NULL ,
    PRIMARY KEY ('idOrder_List') ,
    INDEX 'fk_Order_List_1' ('orderID01' ASC) ,
    INDEX 'fk_Order_List_2' ('orderID02' ASC) ,
    INDEX 'fk_Order_List_3' ('orderID03' ASC) ,
    INDEX 'fk_Order_List_4' ('orderID04' ASC) ,
    CONSTRAINT 'fk_Order_List_1'
      FOREIGN KEY ('orderID01' )
      REFERENCES 'mydb'.'Order' ('idOrder' )
      ON DELETE CASCADE
      ON UPDATE CASCADE,
    CONSTRAINT 'fk_Order_List_2'
      FOREIGN KEY ('orderID02' )
      REFERENCES 'mydb'.'Order' ('idOrder' )
      ON DELETE NO ACTION
      ON UPDATE NO ACTION,
    CONSTRAINT 'fk_Order_List_3'
      FOREIGN KEY ('orderID03' )
      REFERENCES 'mydb'.'Order' ('idOrder' )
      ON DELETE NO ACTION
      ON UPDATE NO ACTION,
    CONSTRAINT 'fk_Order_List_4'
      FOREIGN KEY ('orderID04' )
      REFERENCES 'mydb'.'Order' ('idOrder' )
      ON DELETE NO ACTION
      ON UPDATE NO ACTION)
    ENGINE = InnoDB

第一种方法结合了声明。第二种方法将其拆分。哪一个更好?一个人在另一个人身上是否有任何固有的弱点?谢谢!

3 个答案:

答案 0 :(得分:4)

这与FK不同。

  • 确保任何OrderList行中4列的组合存在于'mydb'.'Order'
  • 的单行行中
  • 另一个确保任何OrderList行中的4列值在某些'mydb'.'Order'行中独立

答案 1 :(得分:1)

不同之处在于,在第一个示例中,您有一个 FOREIGN KEY约束(由四列组成),而在第二个示例中,您有四个 { {1}}约束。

在第一个示例中,四列引用FOREIGN KEY表中的同一列,因此您只能存储4个相同订单ID的组合。因此,它不比简单的单列参考更有用。

如果您使用第二个示例,您将能够在Order表格中存储4个订单的任意组合。

答案 2 :(得分:0)

这是做出订单清单的一种可怕方式。您应该有一个订单列表表和一个订单列表条目表。这样,您在列表中只有4个项目,并且订单列表条目表中只有一个索引/外键到订单表。