我有一个包含多个列的表,其中定期插入数据。我想关注两个字段,如果在 A 列中输入一个值,则不应在 B 列中输入任何值。希望这是有道理的;我将在下面进行说明:
TABLE TEST
COLUMN a
COLUMN b
COLUMN c
DATEADDED
INSERT INTO TEST(COLUMN A, COLUMN B)
VALUE('HELLO','HELLO')
这不应该被允许发生,而是应该在任何一个中都有一个空值。基本上是限制一个值在给定记录的任一列中的约束。
我有一个包含多个列的表,其中定期插入数据。我想关注两个字段,如果在 A 列中输入一个值,则不应在 B 列中输入任何值。希望这是有道理的;我将在下面进行说明:
TABLE TEST
COLUMN a
COLUMN b
COLUMN c
DATEADDED
INSERT INTO TEST(COLUMN A, COLUMN B)
VALUE('HELLO','HELLO')
这不应该被允许发生,而是应该在任何一个中都有一个空值。基本上是限制一个值在给定记录的任一列中的约束。
请在http://www.w3schools.com/sql/sql_check.asp检查检查约束
在您的情况下,您可以执行以下操作:
CREATE TABLE Persons
(
a VARCHAR(255) NULL,
b VARCHAR(255) NULL,
c VARCHAR(255) NULL,
DATEADDED DATETIME DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT chk_AtLeastOneNull CHECK (A IS NULL OR B IS NULL)
)
如果你这样做,在插入中
insert into Persons(a,b,c) values ('a', 'b', null)
你会得到错误
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "chk_AtLeastOneNull". The conflict occurred in database "databasename", table "dbo.Persons".
The statement has been terminated.
您可以在检查中组合其他表达式,例如:
CONSTRAINT chk_AtLeastOneNull CHECK (A IS NULL OR (A IS NOT NULL AND B IS NULL))
我建议您查看检查约束
CHECK 约束通过限制一个或多个列接受的值来强制域完整性。您可以使用基于逻辑运算符返回 TRUE 或 FALSE 的任何逻辑(布尔)表达式创建 CHECK 约束。
您可以将多个 CHECK 约束应用于单个列。您还可以通过在表级别创建单个 >CHECK 约束来将其应用于多个列。
也看看SQL CHECK 约束
CHECK 约束用于限制可以放在列中的值范围。
如果您在单个列上定义 CHECK 约束,则它只允许该列的某些值。
如果您在表上定义 CHECK 约束,它可以根据行中其他列中的值来限制某些列中的值。