SQLite - 在表 1 上插入触发器以有条件更新表 2

标签 sqlite triggers insert

背景:

我的触发器可以工作,但坏了。由于目标表 [tbl_ccc_part] 上的编码和 UNIQUE 值,触发器会将所有插入的值扔到表中,并默默地删除违反 UNIQUE 条件的值。这会导致 [tbl_ccc_part] 增加 2,000 条记录,而不是几百条。

问题:

我如何有效地限制这个触发点,以便我回到最初的意图。

预期代码演练:

插入 [tbl_ccc_inventory.[business_level_supplier_id]]、[tbl_ccc_inventory.[stock_number]] 的 [tbl_ccc_inventory] ​​以及其他不相关记录。

TRIGGER 查看 [tbl_ccc_part.[business_level_supplier_id]] 和 [tbl_ccc_part.[stock_number]]。如果两者匹配,则插入。如果没有匹配,则插入记录。

代码:

  CREATE TRIGGER trg_insert_ccc_inventory AFTER INSERT ON tbl_ccc_inventory
  /*  This trigger automatically updates tbl_ccc_part after entries are
      inserted into the tbl_ccc_inventory.  These entries make several
      assumptions about the values needed for tbl_ccc_part and should
      be verified for accuracy by someone. */
    BEGIN
      INSERT OR IGNORE INTO tbl_ccc_part
        (
          record_id,
          business_level_supplier_id,
          stock_number,
          oem_part_number,
          part_type,
          assembly_indicator,
          insurer_program,
          warranty_type,
          warranty_length,
          shippable_part
        )
      VALUES (
          "A",
          new.business_level_supplier_id,
          new.stock_number,
          new.stock_number,
          "OD",
          "N",
          "N/A",
          "LIMITED",
          "LIMITED",
          "Y");
  END;

最佳答案

要有条件地执行触发器,请使用 WHEN clause :

CREATE TRIGGER xxx
AFTER INSERT ON tbl_ccc_inventory
WHEN NOT EXISTS (SELECT 1
                 FROM tbl_ccc_part
                 WHERE business_level_supplier_id = NEW.business_level_supplier_id
                   AND stock_number               = NEW.stock_number)
BEGIN
    INSERT ...;
END;

关于SQLite - 在表 1 上插入触发器以有条件更新表 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28790291/

相关文章:

php - 如何在 CloudFoundry (PHP Buildpack) 上启用 SQLite 支持

sql - knex 如何处理 SQLite 中的默认值?

MySQL 防止重复插入

mysql - MySQL 中的嵌套联合语句

Heroku 上的 JAVA RESTful 服务器 : allow the upload/reading of the SQLite database

python - 具有重复值的 Sqlite 列

sql - 使用关系表触发器删除值与

stored-procedures - Informix 有计划触发器吗?

java - 用于获取插入值的 Cassandra 示例触发代码

mysql - 是否可以从 CentOS 命令行执行数据库插入?