mysql - 一次声明多个外键和单独声明它们有什么区别?

标签 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

第一种方法结合声明。第二种方法将其拆分。哪一个更好?一个比另一个有任何固有的弱点吗?谢谢!

最佳答案

这不是同一个 FK。

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

关于mysql - 一次声明多个外键和单独声明它们有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8051607/

相关文章:

php - 将查询转换为 codeigniter 格式

python - 使用 Python 从 MySQLdb 中提取条目

mysql - SQL - 基于同一个表中的多个条目进行选择?

mysql - 以字符串格式返回 MySQL 表中的所有列

mysql - 大量小型 MySQL 数据库的云服务?

MySQL:来自 3 个不同表的总和

php - 尝试使用 datagrip IDE 更新表 mySql 中的日期

java - AWS Elastic Beanstalk 中的 JDBC 连接字符串

php - MySQL/PHP 查询

php - Laravel 访客计数器