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个属性的主要内容,如果未能解决你的问题,请参考以下文章