【问题标题】:How do I set a column to be unique, but only under a condition?如何将列设置为唯一,但仅在某个条件下?
【发布时间】:2017-03-24 18:17:28
【问题描述】:

我有一个表,它有一个 ID、一个列“A”和其他列。如果 A 设置为“this”,则不能有另一个 ID 的列 A 设置为“this”。否则,该 ID 的多个条目可能会为“A”列设置多个值。

例如:

ID | A | other columns

这是允许的:

1 | that | ...
1 | something | ...
1 | foo | ...

但这不是:

1 | this | ...
1 | that | ...

(三个点表示我们拥有什么数据并不重要)

我在 MySQL Workbench 上执行此操作,因此如果您的回答告诉我如何在此处执行此操作,我们将不胜感激。

【问题讨论】:

    标签: mysql unique-constraint


    【解决方案1】:

    您需要创建一个触发器,该触发器将在每个 INSERT 或 UPDATE 语句(对于每一行)之前触发,并检查您的约束是否有效以及该行是否可以添加。 AFAIK 在 MySQL 中你实际上需要有两个触发器(每个动作一个),但是没有什么能阻止你在一个过程中包装你的验证并从两个触发器中调用它。

    我将为您提供进一步调整的启动器。

    1.创建插入触发器

    DELIMITER //
    DROP TRIGGER IF EXISTS insert_trg //
    CREATE TRIGGER insert_trg 
      BEFORE UPDATE ON yourtable
      FOR EACH ROW
    BEGIN
      CALL yourprocedure(<arguments here>);
    END //
    DELIMITER ;
    

    2.创建更新触发器类似于插入触发器

    3.使用验证码创建过程


    用于验证约束的 SQL 将类似于:

    SELECT *
    FROM yourtable yt
    WHERE yt.id = NEW.id -- replace with arguments passed to procedure
      AND yt.A  = NEW.A  -- same as above
    

    你很可能需要用 EXISTS 语句和 if 语句来结束它


    一些知识来源:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2020-10-09
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多