插入时如何在不影响现有空值的情况下强制 NOT NULL 约束?

How to force NOT NULL constraint when inserting, without affecting existing null values?

我有一个 table 和一个 SMALLINT 列,该列当前可以为 null,并且有一些 null 值。但是从现在开始不再插入空值。

但我也想保留现有的空值,因为 null0 具有不同的含义。所以我认为向列添加一个 NOT NULL 约束是不可能的。

在这种情况下我应该使用什么样的约束?

您可以添加检查约束以确保该值不为 NULL,然后使用 NOCHECK 选项应用检查约束,而不是使列 NOT NULL(这不会起作用)。这是一个例子:

USE tempdb;
GO

DROP TABLE IF EXISTS dbo.Test;

CREATE TABLE dbo.Test
(
    TestID int IDENTITY(1,1) NOT NULL
        CONSTRAINT PK_dbo_Test PRIMARY KEY,
    TestName varchar(50) NULL
);
GO

INSERT dbo.Test (TestName)
VALUES ('Fred'), (NULL), ('Mary');
GO

ALTER TABLE dbo.Test
WITH NOCHECK ADD CONSTRAINT CK_dbo_Test_TestName_not_null
CHECK (TestName IS NOT NULL);
GO

-- OK
INSERT dbo.Test (TestName)
VALUES ('Mia');
GO

-- Not OK
INSERT dbo.Test (TestName)
VALUES (NULL);
GO