【问题标题】:SQLite trigger always fireSQLite 触发器总是触发
【发布时间】:2020-12-05 10:38:08
【问题描述】:

如果项目不存在,我会在 uni 字段表中插入项目;为此,我有一个简单的触发器:

CREATE TRIGGER Insert_Producer
    BEFORE INSERT
    ON Producers
    WHEN NEW.Producer NOT IN (SELECT Producer FROM Producers)
BEGIN
    INSERT INTO Producers values(NEW.Producer);
END

但它不起作用,我无法找到原因。 谢谢

【问题讨论】:

    标签: sqlite triggers insert


    【解决方案1】:

    我猜Producers 表还有除Producer 之外的其他列。
    如果是这样,那么这个语句会抛出一个错误:

    INSERT INTO Producers values(NEW.Producer);
    

    您应该在语句中提及将接收值NEW.Producer 的列:

    INSERT INTO Producers(Producer) values(NEW.Producer);
    

    即使您确实进行了此更改,触发器也不会按照您的预期执行,因为如果值已存在于表中,则没有任何内容可以中止插入新行。

    但您不需要此触发器。
    您所要做的就是为Producer 列定义一个UNIQUE constraint,然后就完成了。

    【讨论】:

      【解决方案2】:

      我找到了工作触发器:

      CREATE TRIGGER Insert_Producer
          BEFORE INSERT
          ON Producers
      BEGIN
          SELECT
          CASE 
          WHEN NEW.Producer IN (SELECT Producer FROM Producers) THEN
          RAISE(IGNORE)
          END;
      END;
      

      虽然不是最好的,但桌子很少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        相关资源
        最近更新 更多