【问题标题】:Constraint for restricting NULL values in combination of columns限制列组合中的 NULL 值的约束
【发布时间】:2020-09-29 05:59:35
【问题描述】:

我正在尝试使用主键创建一个表。例如下面是表结构

+--------+----------+------+-----------+--------------+
| 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
        )
)

【问题讨论】:

    标签: sql sql-server constraints


    【解决方案1】:

    你可以试试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))
    )
    

    【讨论】:

    【解决方案2】:

    像这样使用触发器回滚事务:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      相关资源
      最近更新 更多