【问题标题】:How do I create an SQLite trigger on a table based on data in other tables?如何根据其他表中的数据在表上创建 SQLite 触发器?
【发布时间】:2020-09-05 06:34:39
【问题描述】:

我有两张桌子 -

part(partID, brand, price, size)
consists_of(customerID, partID, quantity, price, shipdate)
                        |
                        FK part.ID from part

part 永远不会更改/更新,但consists_of 会。

  1. 如何在consists_of 上添加[插入前?] 触发器,检查每个条目的consists_of.price 是否小于或等于特定consists_of.partIDconsists_of.quantity * part.price,如果不是则引发中止是吗?

或者,

  1. 如何在INSERT INTO consists_of(price) VALUES (...)consists_of 上添加[插入后?] 触发器,其中consists_of.price 的值等于consists_of.quantity * part.priceconsists_of.partID

【问题讨论】:

标签: sql sqlite triggers database-trigger


【解决方案1】:

如果我理解正确,您可以在子查询中选择part.price 并计算part.price * consists_of.quantitiy

  1. 插入前
CREATE TABLE part(part_id INTEGER, price INTEGER);
CREATE TABLE consists_of(customer_id INTEGER, part_id INTEGER, quantity INTEGER, price INTEGER);

INSERT INTO part VALUES(10, 50);
INSERT INTO part VALUES (20, 1000);

CREATE TRIGGER IF NOT EXISTS raise_if_consists_of_price_too_expensive
AFTER INSERT ON consists_of
WHEN new.price > (SELECT part.price * new.quantity FROM part WHERE part.part_id = new.part_id)
BEGIN
  SELECT RAISE (ABORT, 'too expensive.');
END;

 -- OK
INSERT INTO consists_of(customer_id, part_id, quantity, price)
VALUES(10050, 20, 31, 100);
 -- OK
INSERT INTO consists_of(customer_id, part_id, quantity, price)
VALUES(80030, 10, 9, 50 * 9);
 -- Raise abort
INSERT INTO consists_of(customer_id, part_id, quantity, price)
VALUES(80099, 10, 9, 50 * 9 + 1);

  1. 插入后
CREATE TABLE part(part_id INTEGER, price INTEGER);
CREATE TABLE consists_of(customer_id INTEGER, part_id INTEGER, quantity INTEGER, price INTEGER);

INSERT INTO part VALUES(10, 50);
INSERT INTO part VALUES (20, 1000);

CREATE TRIGGER IF NOT EXISTS fill_consists_of_price
AFTER INSERT ON consists_of
BEGIN
  UPDATE consists_of
  SET
  price = (
    SELECT consists_of.quantity * part.price
    FROM part
    WHERE part.part_id = consists_of.part_id
  )
  WHERE customer_id = new.customer_id AND part_id = new.part_id
  ;
END;

INSERT INTO consists_of(customer_id, part_id ,quantity)
VALUES(10050, 20, 31);

INSERT INTO consists_of(customer_id, part_id ,quantity)
VALUES(80033, 10, 9);

【讨论】:

  • 这是准确的。谢谢你。我不知道它可以在没有变量的情况下完成。我在哪里可以找到更多此类示例,或者说我可以阅读的资源?
  • 对不起,我对 SQLite 没有经验。如果你想要学习材料,你最好找其他人。希望你能找到一个好的导师。仅供参考,我在这里所做的是: 1. 谷歌搜索“sqlite 触发器插入另一个表”并找到 stackoverflow.com/a/49604621/12656244 2. 谷歌搜索“sqlite 触发器 if 子句”,“sqlite 触发器中止”并找到 stackoverflow.com/a/4609225/12656244 stackoverflow.com/q/16906172/12656244 3. 结合结果。 4. 在我的电脑上试过。
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多