【问题标题】:Sql Server - Constraint - Allow to set column A only if column B is null and vice-versaSql Server - 约束 - 仅当 B 列为空时才允许设置 A 列,反之亦然
【发布时间】:2010-07-14 19:01:57
【问题描述】:

有没有办法在 SQL Server 2008 中添加一个约束来验证如果用户尝试在 A 列中输入一个值,它只能在 B 列为空时才可以,反之亦然

例子

  • 如果 A 为 NULL,则 B 可以有值
  • 如果 B 为 NULL,则 A 可以有一个值
  • A 和 B 不能同时具有值​​

【问题讨论】:

    标签: sql sql-server constraints


    【解决方案1】:

    类似这样的:

    ALTER TABLE foo WITH CHECK ADD
        CONSTRAINT CK_Foo_reason CHECK (
            ColA IS NOT NULL AND ColB IS NULL
            OR
            ColA IS NULL AND ColB IS NOT NULL
            )
    

    编辑:问题更新后

    这取决于在哪种情况下两列都允许为NULL

            ColA IS NULL OR ColB IS NULL
    

    编辑 2:对于 3 列,其中之一必须为 NOT NULL

    恐怕没有聪明人回答。我添加了空格以希望使其更清晰

    ALTER TABLE foo WITH CHECK ADD
        CONSTRAINT CK_Foo_reason CHECK (
            ColA IS NOT NULL AND ColB IS NULL     AND ColC IS NULL
            OR
            ColA IS NULL     AND ColB IS NOT NULL AND ColC IS NULL
            OR
            ColA IS NULL     AND ColB IS NULL     AND ColC IS NOT NULL
            )
    

    【讨论】:

    • 阅读他的问题,在我看来,他只希望一次不为空
    • @Tom H:是的。这是我的第二种情况,它与你的情况相匹配,它允许两者都为 NULL。
    • 如果我得到 3 个值,比如说 C 列,约束条件是什么?
    【解决方案2】:

    这似乎对我有用:

    CREATE TABLE dbo.Test_Constraint
    (
        a INT NULL,
        b VARCHAR(10) NULL,
        CONSTRAINT Test_Constraint_CHK CHECK (a IS NULL OR b IS NULL)
    )
    

    【讨论】:

    • 我的回答很好,汤姆。我全忘了。
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2022-09-27
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多