嗨,我有一个包含 3 个属性作为主键的表
产品:
主键(产品名称
、类别
、产品类型
)。
现在我在另一个表中引用这个复合主键
订单详情: 外键(产品名称,产品类型,类别)引用产品(产品名称,产品类型,类别)
但是我在控制台中收到错误消息,提示缺少括号,并且我无法添加外键。但是,如果我在引用中仅添加 2 个列名称(例如:“外键(产品名称,产品类型,类别)引用产品(产品名称,产品类型) ") 查询没有给出错误。
请帮我解决这个问题。请在下面找到我的代码
CREATE TABLE `products` ( `product_name` varchar(45) NOT NULL, `product_type` varchar(45) NOT NULL, `category` varchar(45) NOT NULL, `product_desc` varchar(150) DEFAULT NULL, `unit_price` int(11) NOT NULL, `supplier_id` int(11) NOT NULL, `units_in_stock` int(11) NOT NULL, PRIMARY KEY (`product_name`,`category`,`product_type`), INDEX (product_name,category,product_type), CONSTRAINT `supplier_prod_table_fkey` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`supplier_id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=INNODB; 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,product_type,category), foreign key(product_name,product_type,category) references products(product_name,product_type,category) );
最佳答案
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)
);
关于mysql复合外键引用超过2个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29360579/