【问题标题】:Cannot insert the value NULL into column X, column X does not allow nulls. INSERT fails.无法将值 NULL 插入 X 列,X 列不允许空值。插入失败。
【发布时间】:2023-03-22 21:40:01
【问题描述】:

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

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

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
)

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

【问题讨论】:

  • 您知道GraveTypeIDPlotIDOccupied 不能为空。为什么只在表中插入GraveName??????
  • 我目前只有 GraveName 的数据,我只是尝试更改这些数据,但仍然遇到同样的错误。
  • 根据你的定义,坟墓必须有一个情节和一个类型。因此,如果没有这些信息,您将无法插入。占用很容易,您可以随时分配默认值(例如:0或1)。

标签: sql sql-server-2017


【解决方案1】:

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

一个简单的解决方案是:

INSERT INTO tblGrave (GraveName, Occupied)
    SELECT Grave, 0
    FROM tblPlotsandOccupants;

这可以解决您当前的问题,但随后您会在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
);

【讨论】:

  • 谢谢,这工作我已经改变了我的表架构
【解决方案2】:

当您创建表时,您将该列定义为“NOT NULL”,而不是允许它为空。

您需要允许“Occupied”为空,设置默认值,或在插入时定义您想要的值。

您甚至可以将值设置为“”,它是空白但不为空。

编辑

注意@Gordon 对 sql 示例的回答。

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多