SQL Server为什么会引发此错误:无法将值NULL插入列'id'中?

我正在使用以下查询:

INSERT INTO role (name, created) VALUES ('Content Coordinator', GETDATE()), ('Content Viewer', GETDATE())

但是,我没有指定主键(即id)。 所以我的问题是,为什么sql server会返回此错误:

Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'id', table 'CMT_DEV.dbo.role'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Webnet asked 2019-10-08T06:50:44Z
11个解决方案
115 votes

我假设Indentity Specification应该是一个递增值。

您需要设置它,否则,如果您有一个不可为空的列,并且没有默认值,那么如果您不提供任何值,它将出错。

要在SQL Server Management Studio中设置自动增量,请执行以下操作:

  • Indentity Specification中打开表格
  • 选择您的列并转到Indentity Specification
  • Indentity Specification下,设置(Is Identity)=YesIndentity Increment=1
Curt answered 2019-10-08T06:51:29Z
5 votes

如果id列没有默认值,但约束为NOT NULL,则您必须自己提供一个值

INSERT INTO dbo.role (id, name, created) VALUES ('something', 'Content Coordinator', GETDATE()), ('Content Viewer', GETDATE())
Andy Irving answered 2019-10-08T06:51:55Z
2 votes

创建表时使用IDENTITY(1,1)例如

CREATE TABLE SAMPLE(
[Id]     [int]  IDENTITY(1,1) NOT NULL,
[Status] [smallint] NOT NULL,

CONSTRAINT [PK_SAMPLE] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)
)
Minakshi Korad answered 2019-10-08T06:52:24Z
1 votes

您没有提供id的值。 尝试这个 :

INSERT INTO role (id, name, created) VALUES ('example1','Content Coordinator', GETDATE()), ('example2', 'Content Viewer', GETDATE())

或者,如果需要自动添加的id值,则可以在id字段上设置自动递增。

natadecoco answered 2019-10-08T06:52:57Z
1 votes

如果您不能或不想设置id的autoincrement属性,则可以为每一行的id设置值,如下所示:

INSERT INTO role (id, name, created)
SELECT 
      (select max(id) from role) + ROW_NUMBER() OVER (ORDER BY name)
    , name
    , created
FROM (
    VALUES 
      ('Content Coordinator', GETDATE())
    , ('Content Viewer', GETDATE())
) AS x(name, created)
robotik answered 2019-10-08T06:53:23Z
0 votes

您或者需要在插入中指定一个ID,或者需要在数据库中配置id列以使Identity Specification = Yes。

JupiterP5 answered 2019-10-08T06:53:49Z
0 votes

由于id是PK,因此必须唯一且不能为null。如果您在字段列表中未提及任何要插入的字段,则该字段应为null或默认值。如果您不想每次手动设置该字段,请为此字段设置标识(即自动递增)。

quzary answered 2019-10-08T06:54:15Z
0 votes

创建表时,需要将id列的autoincrement属性设置为true,或者可以更改现有表来执行此操作。

RisingDragon answered 2019-10-08T06:54:42Z
0 votes

@curt是正确的,但是我注意到有时即使失败也会出现NULL不允许的错误,并且它似乎是间歇性的。通过将“ Indenty Seed”也设置为1和IDENTITY(1, 1) NOT FOR REPLICATION,我始终避免了该错误。

Fandango68 answered 2019-10-08T06:55:08Z
0 votes

就我而言

我试图通过要求使用外键来更新我的模型,但是数据库中某些字段中的先前输入数据中已经有“空”数据。 因此,每次我运行update-database ...我都会收到错误。

我通过从数据库中手动删除所有我要求的列中具有空值的行来解决。

JPTugirimana answered 2019-10-08T06:55:44Z
-3 votes

您可以在ID列中手动插入一个值(在这里我称之为“ PK”):

insert into table1 (PK, var1, var2)
values ((select max(PK)+1 from table1), 123, 456)
Lømmis answered 2019-10-08T06:56:10Z
translate from https://stackoverflow.com:/questions/10013313/why-is-sql-server-throwing-this-error-cannot-insert-the-value-null-into-column