列组合中限制 NULL 值的约束
Constraint for restricting NULL values in combination of columns
我正在尝试使用主键创建 table。例如下面是 table 结构
+--------+----------+------+-----------+--------------+
| ID | NAME | SOLD | PURCHASED | MANUFACTURED |
+--------+----------+------+-----------+--------------+
| 522345 | ProductA | 23 | NULL | 45 |
+--------+----------+------+-----------+--------------+
| 502345 | ProductB | NULL | 56 | NULL |
+--------+----------+------+-----------+--------------+
在这里我必须确保所有 3 列 (SOLD/PURCHASED/MANUFACTURED) 不应该为 NULL。但是任何 1 或 2 列都可以为 NULL。我如何为这种情况创建约束?请建议。我尝试了以下查询,但它期望所有 3 列的值。我运行没主意了。
CREATE TABLE MYTABLE (
ID VARCHAR(20) NOT NULL,
NAME VARCHAR(50),
SOLD INT NOT NULL,
PURCHASED INT NOT NULL,
MANUFACTURED INT NOT NULL,
CONSTRAINT [PK_MYTABLE] PRIMARY KEY CLUSTERED
(
[ID] ASC,
[SOLD] ASC,
[PURCHASED] ASC,
[MANUFACTURED] ASC
)
)
你可以试试CHECK CONSTRAINT
CREATE TABLE MYTABLE (
ID VARCHAR(20) NOT NULL,
NAME VARCHAR(50),
SOLD INT,
PURCHASED INT,
MANUFACTURED INT,
CONSTRAINT CHK_NULL CHECK ((SOLD IS NOT NULL) OR (MANUFACTURED IS NOT NULL) OR (PURCHASED IS NOT NULL))
)
像这样使用触发器回滚事务:
create trigger dbo.check_insert_null_items on dbo.MYTABLE after insert as
begin
if exists ( select * from inserted where SOLD is null and PURCHASED is null and MANUFACTURED is null)
begin
rollback transaction
raiserror ('error: ... ', 16, 1)
end
end
我正在尝试使用主键创建 table。例如下面是 table 结构
+--------+----------+------+-----------+--------------+
| ID | NAME | SOLD | PURCHASED | MANUFACTURED |
+--------+----------+------+-----------+--------------+
| 522345 | ProductA | 23 | NULL | 45 |
+--------+----------+------+-----------+--------------+
| 502345 | ProductB | NULL | 56 | NULL |
+--------+----------+------+-----------+--------------+
在这里我必须确保所有 3 列 (SOLD/PURCHASED/MANUFACTURED) 不应该为 NULL。但是任何 1 或 2 列都可以为 NULL。我如何为这种情况创建约束?请建议。我尝试了以下查询,但它期望所有 3 列的值。我运行没主意了。
CREATE TABLE MYTABLE (
ID VARCHAR(20) NOT NULL,
NAME VARCHAR(50),
SOLD INT NOT NULL,
PURCHASED INT NOT NULL,
MANUFACTURED INT NOT NULL,
CONSTRAINT [PK_MYTABLE] PRIMARY KEY CLUSTERED
(
[ID] ASC,
[SOLD] ASC,
[PURCHASED] ASC,
[MANUFACTURED] ASC
)
)
你可以试试CHECK CONSTRAINT
CREATE TABLE MYTABLE (
ID VARCHAR(20) NOT NULL,
NAME VARCHAR(50),
SOLD INT,
PURCHASED INT,
MANUFACTURED INT,
CONSTRAINT CHK_NULL CHECK ((SOLD IS NOT NULL) OR (MANUFACTURED IS NOT NULL) OR (PURCHASED IS NOT NULL))
)
像这样使用触发器回滚事务:
create trigger dbo.check_insert_null_items on dbo.MYTABLE after insert as
begin
if exists ( select * from inserted where SOLD is null and PURCHASED is null and MANUFACTURED is null)
begin
rollback transaction
raiserror ('error: ... ', 16, 1)
end
end