mysql复合外键引用超过2个属性

Posted

技术标签:

【中文标题】mysql复合外键引用超过2个属性【英文标题】:mysql composite foreign key referencing more than 2 attributes 【发布时间】:2015-06-04 07:36:01 【问题描述】:

您好,我有一个包含 3 个属性作为主键的表 产品: 主键 (product_name,category,product_type)。

现在我在另一个表中引用这个复合主键

订单详情: 外键(product_name,product_type,category) 引用产品(product_name,product_type,category)

但是我在控制台中收到一个错误,提示缺少括号,我无法添加外键。但是,如果我在参考中仅添加 2 个列名(例如:“外键(产品名称,产品类型,类别)引用产品(产品名称,产品类型) ") 查询没有给出错误。

请帮我解决这个问题。请在下面找到我的代码

创建表`产品`( `product_name` varchar(45) NOT NULL, `product_type` varchar(45) NOT NULL, `category` varchar(45) NOT NULL, `product_desc` varchar(150) 默认为空, `unit_price` int(11) 非空, `supplier_id` int(11) NOT NULL, `units_in_stock` int(11) 非空, 主键(`product_name`,`category`,`product_type`), 索引(产品名称、类别、产品类型), 约束`supplier_prod_table_fkey`外键(`supplier_id`)参考 `supplier` (`supplier_id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) 引擎=创新; 创建表`order_details`( `order_id` int(11) NOT NULL AUTO_INCREMENT, `product_name` varchar(45) NOT NULL, `product_type` varchar(45) NOT NULL, `category` varchar(45) NOT NULL, `数量` int(11) 默认为空, 约束`orderid_fkey`外键(`order_id`)参考`orders` (`order_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 主键(`order_id`,`product_name`,`product_type`,`category`), 索引(产品名称,产品类型,类别), 外键(product_name,product_type,category) 引用产品(product_name,product_type,category) );

【问题讨论】:

【参考方案1】:

REFERENCES 和对应索引中的字段在两个表中的顺序必须相同,即(product_name, category, product_type)

CREATE TABLE `order_details` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(45) NOT NULL,
  `product_type` varchar(45) NOT NULL,
  `category` varchar(45) NOT NULL,
  `quantity` int(11) DEFAULT NULL,
  CONSTRAINT `orderid_fkey` FOREIGN KEY (`order_id`) REFERENCES `orders`
  (`order_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  PRIMARY KEY (`order_id`,`product_name`,`product_type`,`category`),
  INDEX (product_name,category,product_type),
  FOREIGN KEY(product_name,category,product_type) REFERENCES products(product_name,category,product_type)

);

【讨论】:

@user2552729 仔细检查。它确实有效,这里是the fiddle。

以上是关于mysql复合外键引用超过2个属性的主要内容,如果未能解决你的问题,请参考以下文章

我从两个外键引用到两个不同的表中创建复合键时出错

外键引用复合表

在复合键和外键之间创建关系

外键(FK_ 必须与引用的主键具有相同的列数

如何让 jOOQ 生成不引用主键的复合外键?

外键可以引用具有复合(即两列的组合)键的表吗?