插入时如何在不影响现有空值的情况下强制 NOT NULL 约束?
How to force NOT NULL constraint when inserting, without affecting existing null values?
我有一个 table 和一个 SMALLINT
列,该列当前可以为 null,并且有一些 null 值。但是从现在开始不再插入空值。
但我也想保留现有的空值,因为 null
和 0
具有不同的含义。所以我认为向列添加一个 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
我有一个 table 和一个 SMALLINT
列,该列当前可以为 null,并且有一些 null 值。但是从现在开始不再插入空值。
但我也想保留现有的空值,因为 null
和 0
具有不同的含义。所以我认为向列添加一个 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