如何引用复合主键?两张表关联SQL实现遇问题
问题分析与解决
你的代码创建失败的核心原因是外键字段顺序和被引用的复合主键顺序不匹配。warehouse_item的复合主键顺序是(warehouse_id, store_id),但你在store表定义外键时用了(store_id, warehouse_id),顺序完全颠倒,数据库无法匹配关联关系。
另外注意表的创建逻辑:因为store表要引用warehouse_item,需确保warehouse_item先被创建,你的代码顺序没问题,但后续插入数据时,要保证warehouse_item中已有对应关联数据,否则外键约束会触发报错。
修正后的代码如下:
DROP TABLE IF EXISTS store; DROP TABLE IF EXISTS warehouse_item; CREATE TABLE warehouse_item ( warehouse_id varchar(3) NOT NULL, store_id varchar(3) NOT NULL, product_id varchar(5) NOT NULL, product_qty integer NOT NULL, PRIMARY KEY (warehouse_id, store_id) ); CREATE TABLE store ( store_id varchar(3) NOT NULL, store_name varchar(30) NOT NULL, store_city varchar(15) NOT NULL, store_address varchar(50) NOT NULL, telephone varchar(15) NOT NULL, latitude decimal NOT NULL, longitude decimal NOT NULL, warehouse_id varchar(3) NOT NULL, PRIMARY KEY (store_id), -- 外键字段顺序与主键顺序保持一致 FOREIGN KEY (warehouse_id, store_id) REFERENCES warehouse_item (warehouse_id, store_id) );
额外提醒
- 复合外键的字段顺序必须和被引用的复合主键完全一致,这是数据库外键约束的硬性要求。
- 确保关联字段的数据类型、长度完全匹配,你这里已经做到了(都是
varchar(3)),类型不匹配也会导致创建失败。 - 从业务逻辑来看,通常是
warehouse_item表的store_id引用store表主键(因为仓库条目属于某个门店),如果你的业务逻辑是反过来的,可根据实际需求调整关联方向。
内容的提问来源于stack exchange,提问作者luca kramp
相关产品推荐
相关产品推荐

