85

我正在使用以下查询:

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.
4

13 回答 13

153

我假设这id应该是一个递增的值。

你需要设置这个,否则如果你有一个不可为空的列,没有默认值,如果你没有提供值,它会出错。

在 SQL Server Management Studio 中设置自动增量:

  • 打开你的桌子Design
  • 选择您的列并转到Column Properties
  • Indentity Specification, 设置(Is Identity)=YesIndentity Increment=1
于 2012-04-04T14:36:40.817 回答
8

在创建表时使用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
)
)
于 2018-01-09T19:41:03.503 回答
4

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

INSERT INTO dbo.role (id, name, created) VALUES ('something', 'Content Coordinator', GETDATE()), ('Content Viewer', GETDATE())
于 2012-04-04T14:40:26.773 回答
1

如果您不能或不想设置 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)
于 2018-04-16T02:13:07.863 回答
0

您要么需要在插入中指定 ID,要么需要将数据库中的 id 列配置为 Identity Specification = Yes。

于 2012-04-04T14:38:15.507 回答
0

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

于 2012-04-04T14:38:26.130 回答
0

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

于 2012-04-04T14:44:32.463 回答
0

你没有给 id 一个值。试试这个 :

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

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

于 2017-05-09T02:04:17.840 回答
0

我有一个类似的问题,在查看它时,它只是实际表中的一个字段丢失ididempty/null)-这意味着当您尝试创建该id字段时primary key,它将导致错误,因为该表包含一个null值为primary key.

如果您看到与错误关联的临时表,这可能是修复。我使用的是 SQL Server Management Studio。

于 2019-11-01T15:22:38.567 回答
-1

@curt 是正确的,但我注意到有时即使这样也会失败并出现 NULL 不允许的错误,而且它似乎是断断续续的。通过将 Indenty Seed 设置为 1 和IDENTITY(1, 1) NOT FOR REPLICATION.

于 2015-08-17T02:19:12.183 回答
-1

就我而言,

我试图通过需要一个外键来更新我的模型,但是数据库中已经在以前输入的数据的某些列中包含“空”数据。所以每次我运行更新数据库...我都得到了错误。

我通过从数据库中手动删除所有在我需要的列中为空的行来解决它。

于 2018-10-05T00:11:57.070 回答
-1

如果使用实体框架。打开迁移,设置值为 nullable: true,并更新数据库

在此处输入图像描述

于 2020-08-13T07:45:04.757 回答
-4

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

insert into table1 (PK, var1, var2)
values ((select max(PK)+1 from table1), 123, 456)
于 2015-06-10T10:44:20.387 回答