无法将值 NULL 插入 X 列,X 列不允许为空。插入失败。

Tat*_*tti 2 sql sql-server-2017

我是 SQL Server 的新手,我收到此错误“无法将 NULL 值插入列 'Occupied',表 'DBProjectHamlet.dbo.tblGrave';列不允许空值。插入失败。语句已终止。”

这是我的插入代码,然后是创建表的代码

INSERT INTO tblGrave (GraveName)
SELECT Grave
FROM tblPlotsandOccupants


IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'tblGrave' AND TABLE_SCHEMA = 'dbo')
    DROP TABLE dbo.tblGrave;
    GO
CREATE TABLE tblGrave
(
GraveID INT IDENTITY (1,1),
GraveName VARCHAR(MAX) NULL,
GraveTypeID INT NOT NULL,
PlotID INT NOT NULL,
Occupied BIT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

我不想在 Occupied 列中插入任何内容,我不知道为什么会发生这种情况或如何解决它。我只想将值插入到 tblGrave (GraveName) 中。任何帮助都会很棒。

Gor*_*off 6

确切地!你没有做任何事情,Occupied这就是问题所在。该列被指定为NOT NULL但没有默认值。您没有插入值,因此它获得默认值。默认默认值为NULL,这是不允许的。

一种简单的解决方案是:

INSERT INTO tblGrave (GraveName, Occupied)
    SELECT Grave, 0
    FROM tblPlotsandOccupants;
Run Code Online (Sandbox Code Playgroud)

这可以解决您当前的问题,但是您会在PlotId.

一个更健壮的解决方案是为NOT NULL列添加一个默认值,并将其余的声明为可以为空(默认值)。像这样的东西:

CREATE TABLE tblGrave (
    GraveID INT IDENTITY (1,1) PRIMARY KEY,
    GraveName VARCHAR(MAX),
    GraveTypeID,
    PlotID INT,
    Occupied BIT NOT NULL DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)