我有一个名为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
第一种方法结合了声明。第二种方法将其拆分。哪一个更好?一个人在另一个人身上是否有任何固有的弱点?谢谢!
答案 0 :(得分:4)
这与FK不同。
'mydb'.'Order'
'mydb'.'Order'
行中独立 答案 1 :(得分:1)
不同之处在于,在第一个示例中,您有一个 FOREIGN KEY
约束(由四列组成),而在第二个示例中,您有四个 { {1}}约束。
在第一个示例中,四列引用FOREIGN KEY
表中的同一列,因此您只能存储4个相同订单ID的组合。因此,它不比简单的单列参考更有用。
如果您使用第二个示例,您将能够在Order
表格中存储4个订单的任意组合。
答案 2 :(得分:0)
这是做出订单清单的一种可怕方式。您应该有一个订单列表表和一个订单列表条目表。这样,您在列表中只有4个项目,并且订单列表条目表中只有一个索引/外键到订单表。