SQL Server插入报错无法向rrrId列插NULL,如何无需指定标识列插入
问题解决说明
报错核心原因
你混淆了表内两个int类型字段的属性:
rrrColumnId是配置了IDENTITY(1,1)的标识列,确实无需手动指定值,插入数据时数据库会自动生成自增主键- 报错提示的
rrrId是普通非空字段,同时绑定了指向rrr.rrrs表的外键约束,本身没有标识属性,插入时必须传值,这才是插入失败的根本原因。
另外注意:SQL Server 单表仅支持配置一个IDENTITY标识列,你当前的标识列已经分配给rrrColumnId,无法再为rrrId设置自增属性。
解决方案
方案一(推荐,符合外键设计逻辑)
插入语句中补充rrrId字段的赋值即可,不需要手动指定标识列rrrColumnId,示例如下(rrrId的值替换为你rrr.rrrs表中实际存在的对应值即可):
INSERT INTO [rrr].[rrrColumns]([rrrId], [Header],[FormElementId]) VALUES (1, 'F2','2F0B9649-2AF7-4C6E-9A0B-02C2C8FE7BB8')
方案二(仅适用于业务不需要rrrId非空/外键约束的场景)
如果业务逻辑允许你去掉rrrId的非空约束,或者给它设置默认值,可以修改表结构后再插入:
-- 方案2.1:修改rrrId字段允许为空 ALTER TABLE [rrr].[rrrColumns] ALTER COLUMN [rrrId] INT NULL; -- 方案2.2:给rrrId设置符合外键约束的默认值 ALTER TABLE [rrr].[rrrColumns] ADD CONSTRAINT DF_rrrColumns_rrrId DEFAULT 1 FOR [rrrId];
修改完成后你就可以用原来的INSERT语句直接插入数据。
注意:如果保留
rrrId的外键约束,写入的rrrId值必须在父表rrr.rrrs中存在,否则会触发外键约束报错。
内容的提问来源于stack exchange,提问作者Alex Gordon
相关产品推荐
相关产品推荐

