如何向带有复合主键的表插入数据?外键约束报错如何解决?
问题核心原因
你遇到的报错本质是多对多关联中间表FcsGyartjaGya的结构设计错误:作为两张主表的关联表,你给外键字段GyID添加了IDENTITY自增属性,不符合关联表的设计逻辑,由此触发后续报错。
两次报错的具体逻辑
- 第一次非空报错:
CsID是复合主键的组成部分,默认非空,插入时未传值直接触发约束。 - 第二次外键报错:
GyID的自增规则是IDENTITY(3,2),首次插入会自动生成GyID=3,而你的Gyartok主表GyID自增规则是IDENTITY(2,3),生成的ID为2、5、8、11…,自动生成的3不存在于主表中,直接触发外键约束。即使碰巧某次自动生成的ID匹配主表,后续也大概率出现不匹配的问题。
解决方案
方案1:修改表结构(最优,推荐长期使用)
直接删除GyID的自增属性,关联表的两个外键字段均手动指定主表已存在的有效值即可,SQL Server下修改语句如下:
-- 删除原有约束 ALTER TABLE FcsGyartjaGya DROP CONSTRAINT FK_FcsGyartjaGya1; ALTER TABLE FcsGyartjaGya DROP CONSTRAINT PK_FcsGyartjaGya; -- 删除带自增属性的GyID列,重新添加普通非空INT类型的GyID ALTER TABLE FcsGyartjaGya DROP COLUMN GyID; ALTER TABLE FcsGyartjaGya ADD GyID INT NOT NULL; -- 恢复主键和外键约束 ALTER TABLE FcsGyartjaGya ADD CONSTRAINT PK_FcsGyartjaGya PRIMARY KEY (GyID, CsID); ALTER TABLE FcsGyartjaGya ADD CONSTRAINT FK_FcsGyartjaGya1 FOREIGN KEY (GyID) REFERENCES Gyartok(GyID);
修改完成后,插入语句直接指定两个关联字段的有效值即可:
-- GyID和CsID均为对应主表已存在的值 INSERT INTO FcsGyartjaGya (GyID, CsID, Ar) VALUES (2, 7, 300);
方案2:临时兼容方案(仅适合无法修改表结构的场景)
如果暂时无法调整表结构,可以开启自增列手动插入权限,插入时显式指定合法的GyID值:
-- 开启允许手动插入自增列的权限 SET IDENTITY_INSERT FcsGyartjaGya ON; -- 插入时必须显式指定GyID列,值需为Gyartok表已存在的有效值 INSERT INTO FcsGyartjaGya (GyID, CsID, Ar) VALUES (2, 7, 300); -- 插入完成后关闭权限 SET IDENTITY_INSERT FcsGyartjaGya OFF;
内容的提问来源于stack exchange,提问作者dancus25
相关产品推荐
相关产品推荐

