【问题标题】:SQLite Trigger: Update a table after insert is done on anotherSQLite 触发器:在另一个表上完成插入后更新表
【发布时间】:2019-04-01 13:02:17
【问题描述】:

我有三个主要表来跟踪productslocation 和它们之间的logistics,其中包括将产品往返于不同位置。我已经制作了另一张表balance,以保持各个位置每种产品数量的最终平衡。

以下是架构:

products(prod_id INTEGER PRIMARY KEY AUTOINCREMENT,
         prod_name TEXT UNIQUE NOT NULL,
         prod_quantity INTEGER NOT NULL,
         unallocated_quantity INTEGER)

最初,当添加产品时,prod_quantity 和 unallocated_quantity 具有相同的值。然后,每次分配一定数量的相应产品时,都会减去 unallocated_quantity。

location(loc_id INTEGER PRIMARY KEY AUTOINCREMENT,
         loc_name TEXT UNIQUE NOT NULL)

logistics(trans_id INTEGER PRIMARY KEY AUTOINCREMENT,
          prod_id INTEGER NOT NULL,
          from_loc_id INTEGER NULL,
          to_loc_id INTEGER NOT NULL,
          prod_quantity INTEGER NOT NULL,
          trans_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
          FOREIGN KEY(prod_id) REFERENCES products(prod_id),
          FOREIGN KEY(from_loc_id) REFERENCES location(loc_id),
          FOREIGN KEY(to_loc_id) REFERENCES location(loc_id))

balance(prod_id INTEGER NOT NULL,
        loc_id INTEGER NOT NULL,
        quantity INTEGER NOT NULL,
        FOREIGN KEY(prod_id) REFERENCES products(prod_id),
        FOREIGN KEY(loc_id) REFERENCES location(loc_id))

logistics 中创建的每个条目中,我想要一个触发器来更新balance 中的值,从而保留所有交易的摘要(在位置之间移动产品)

我想到了一个触发器解决方案,它检查表logistics 上的每个插入是否在balance 表中已经存在相同的prod_id, loc_id 条目,如果存在将适当更新。但是,我没有使用 SQLite 的经验来实现这个想法。

【问题讨论】:

  • @stovfl 我已阅读文档并编写了用于更新 unallocated_quantity 值的触发器。但我似乎因为我在这里提到的问题而迷失了

标签: python sql sqlite triggers


【解决方案1】:

我相信您的 TRIGGER 会符合以下任何一种情况:-

CREATE TRIGGER IF NOT EXISTS logistics_added AFTER INSERT ON logistics
BEGIN
    UPDATE balance SET quantity = ((SELECT quantity FROM balance WHERE prod_id = new.prod_id AND loc_id = new.from_loc_id) - new.prod_quantity) WHERE prod_id = new.prod_id AND loc_id = new.from_loc_id;
        UPDATE balance SET quantity = ((SELECT quantity FROM balance WHERE prod_id = new.prod_id AND loc_id = new.to_loc_id) + new.prod_quantity) WHERE prod_id = new.prod_id AND loc_id = new.to_loc_id;
END;

或:-

CREATE TRIGGER IF NOT EXISTS logistics_added AFTER INSERT ON logistics
BEGIN
    INSERT OR REPLACE INTO balance VALUES(new.prod_id,new.from_loc_id,(SELECT quantity FROM balance WHERE prod_id = new.prod_id AND loc_id = new.from_loc_id) - new.prod_quantity);
        INSERT OR REPLACE INTO balance VALUES(new.prod_id,new.to_loc_id,(SELECT quantity FROM balance WHERE prod_id = new.prod_id AND loc_id = new.to_loc_id) + new.prod_quantity);
END;

请注意,第二个依赖于使用PRIMARY KEY (prod_id,loc_id)UNIQUE (prod_id,loc_id)balance 表添加唯一约束。无论如何,UNIQUE 约束可能是必需的/想要的。

细微的区别在于,如果不存在合适的余额行,则第二个将插入余额行。如果不存在适当的余额行,后者将什么也不做。

【讨论】:

  • 我尝试了类似于第一种方法的方法,但陷入了语法错误。我当前的实现刚刚摆脱了余额表,并在物流上使用了 INNER JOIN 来生成余额。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多