列组合中限制 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