【问题标题】:UNIQUE constraint but only when column = somethingUNIQUE 约束,但仅当 column = something
【发布时间】:2023-03-13 04:49:01
【问题描述】:

这在 SQLite 中可行吗?

喜欢:

UNIQUE(col1, col2 = "something", col3),

我所说的独特是什么意思:

#1  col1=Foo | col2=Foo       | col3=Foo   > OK
#2  col1=Foo | col2=Foo       | col3=Foo   > OK
#3  col1=Foo | col2=something | col3=Foo   > OK
#4  col1=Foo | col2=something | col3=Foo   > Should fail because of #3
#5  col1=Foo | col2=something | col3=Bar   > OK
#6  col1=Foo | col2=something | col3=Bar   > Should fail because of #5

【问题讨论】:

    标签: sql sqlite pdo constraints unique


    【解决方案1】:

    我尚未对其进行测试,但我认为您可以使用 partial indexes in SQLite 3.8.0(2013 年 8 月 26 日发布)来做到这一点:

    CREATE UNIQUE INDEX
        "partial_index" ON "table" ("col1", "col2", "col3")
    WHERE ("col2" = 'something');
    

    我可能错了。

    【讨论】:

    • Download 命令行 shell 并尝试一下。 (文档已经告诉你你做错了什么。)
    • @CL.:确实,我忽略了LIKE 函数。
    【解决方案2】:

    这是不直接支持的;您必须使用触发器来实现它:

    CREATE TRIGGER something_unique_check
    BEFORE INSERT ON MyTable
    FOR EACH ROW
    WHEN NEW.col2 = 'something'
    BEGIN
        SELECT RAISE(FAIL, '"something" record is not unique')
        FROM MyTable
        WHERE col1 = NEW.col1
          AND col2 = NEW.col2
          AND col3 = NEW.col3;
    END;
    

    【讨论】:

    • 取决于你是否在 (col1,col2,col3) 上有索引……
    • @CL.:您在 SQLite 添加对部分索引的支持后仅一天就回答了,您能否看看我的回答并告诉我这是否有效?我仍然在这里运行旧版本的 SQLite。
    【解决方案3】:

    我建议使用表级cheque 约束

    ALTER TABLE T
    ADD CONSTRAINT CK_something CHECK (col2 != "something" OR (col1<>col2 AND col1<>col3 AND col2<>col3))
    

    其他选项是使用触发器,但这是一种更复杂的方法。

    【讨论】:

    • 这只会检查一条记录。这不是UNIQUE 的用途。
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2021-03-10
    • 2018-11-17
    • 2021-12-09
    • 2017-08-05
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多