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

标签 mysql database foreign-keys constraints

嗨,我有一个包含 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/

相关文章:

mysql - 自然地对包含分层项目名称的列进行排序

php - 如何通过分组优先级对MySQL数据进行排序

sql - PostgreSQL 在外键中使用常量

mysql 查询,不太复杂的查询出现 "sending data"错误

mysql - 使用所选行的现有值自动递增列

mysql - 有什么方法可以替换 SELECT * FROM `INFORMATION_SCHEMA` 查询吗?

postgresql - 递归外键问题

php - 如何使用外键将值保存到数据库

php - 选择 * 时可以排除数据库字段吗

database - db lotus notes的大小