Mysql 一次声明多个外键与单独声明它们有什么区别?
我有一个名为Order_List的表,其中包含一个订单列表。每列包含一个外键,该外键引用订单表中订单的主键。我的问题是,声明这些外键的最佳方式是什么。使用MySQL Workbench,我发现了两种方法 方法#1 方法#2Mysql 一次声明多个外键与单独声明它们有什么区别?,mysql,Mysql,我有一个名为Order_List的表,其中包含一个订单列表。每列包含一个外键,该外键引用订单表中订单的主键。我的问题是,声明这些外键的最佳方式是什么。使用MySQL Workbench,我发现了两种方法 方法#1 方法#2 第一个方法结合了声明。第二种方法将其拆分。哪一个更好?两者之间是否存在固有的弱点?谢谢 这不是同一个FK 可以确保任何OrderList行中的4列组合存在于'mydb.'Order' 另一个确保任何OrderList行中的4列值独立于某些'mydb.'Order'行中的其他
第一个方法结合了声明。第二种方法将其拆分。哪一个更好?两者之间是否存在固有的弱点?谢谢 这不是同一个FK
- 可以确保任何OrderList行中的4列组合存在于
'mydb.'Order'
- 另一个确保任何OrderList行中的4列值独立于某些
行中的其他列值存在'mydb.'Order'
约束(由四列组成),而在第二个示例中,您有四个外键约束
在第一个示例中,这四列引用了订单
表中的同一列,因此您只能存储4个相同的订单ID的组合。因此,它并不比简单的单列引用更有用
如果使用第二个示例,您将能够在OrderList
表中存储4个订单的任意组合。这是创建订单列表的一种非常糟糕的方法。您应该有一个订单列表表和一个订单列表条目表。这样,列表中就不会只有4个项目,订单列表条目表和订单表之间就只有一个索引/外键。所有的orderID
列都会被使用吗?我已经修复了您的格式设置。我们这里不使用bbcode标签。请阅读:
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
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