Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 一次声明多个外键与单独声明它们有什么区别?_Mysql - Fatal编程技术网

Mysql 一次声明多个外键与单独声明它们有什么区别?

Mysql 一次声明多个外键与单独声明它们有什么区别?,mysql,Mysql,我有一个名为Order_List的表,其中包含一个订单列表。每列包含一个外键,该外键引用订单表中订单的主键。我的问题是,声明这些外键的最佳方式是什么。使用MySQL Workbench,我发现了两种方法 方法#1 方法#2 第一个方法结合了声明。第二种方法将其拆分。哪一个更好?两者之间是否存在固有的弱点?谢谢 这不是同一个FK 可以确保任何OrderList行中的4列组合存在于'mydb.'Order' 另一个确保任何OrderList行中的4列值独立于某些'mydb.'Order'行中的其他

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

方法#1

方法#2


第一个方法结合了声明。第二种方法将其拆分。哪一个更好?两者之间是否存在固有的弱点?谢谢

这不是同一个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