如何添加引用复合主键表的外键?SQL执行问题咨询
嘿,这两个关于外键和复合主键的问题我太熟了,给你一步步讲清楚:
1. 能否添加作为引用表主键组成部分的外键?
完全可以!但有个核心要求:你要引用的那部分主键字段,在父表中必须是唯一的——要么它本身有单独的UNIQUE约束,要么它作为复合主键的一部分,天然具备唯一性(这种情况比较少,除非复合主键里的单个字段本身不会重复)。
就拿你提到的场景来说:product表用maker+model作为复合主键,而PC表的model字段既要当自己的主键,又要作为外键关联product的model。这时候必须给product的model字段加唯一约束,不然数据库根本不知道PC里的某个model对应product里的哪一条记录(毕竟同一个model可能被多个maker生产)。如果没加这个约束,你执行创建外键的SQL时肯定会报错。
2. 当引用表的主键为两个字段时,如何添加外键?
如果父表的主键是复合主键(比如product的maker+model),那子表要创建外键的话,得满足两个条件:
- 子表必须包含和父表复合主键完全对应的所有字段(数量、数据类型都要匹配)
- 外键约束要同时关联这些字段,不能只绑其中一个(除非单个字段有独立的唯一约束,就像第一个问题的情况)
给你举个实际的SQL例子:
-- 先创建带复合主键的product表 CREATE TABLE product ( maker VARCHAR(50), model VARCHAR(50), type VARCHAR(20), PRIMARY KEY (maker, model) ); -- 创建laptop表并添加复合外键,关联product的复合主键 CREATE TABLE laptop ( maker VARCHAR(50), model VARCHAR(50), screen_size INT, price DECIMAL(10,2), PRIMARY KEY (maker, model), -- 外键字段顺序要和父表主键顺序一致 FOREIGN KEY (maker, model) REFERENCES product(maker, model) );
另外回到你提到的PC表场景,如果要让PC的model作为外键关联product的model,得先给product的model加唯一约束:
ALTER TABLE product ADD CONSTRAINT unique_product_model UNIQUE (model);
之后再创建PC表:
CREATE TABLE PC ( model VARCHAR(50) PRIMARY KEY, speed INT, ram INT, storage INT, FOREIGN KEY (model) REFERENCES product(model) );
内容的提问来源于stack exchange,提问作者Maroun Nasra
相关产品推荐
相关产品推荐

