我正在嘗試創建一個 SQLite 觸發器來更新balance特定帳戶code。
accounts桌子 :
CREATE TABLE accounts (
year INTEGER NOT NULL,
month INTEGER NOT NULL CHECK(month BETWEEN 1 AND 12),
amount REAL NOT NULL CHECK(amount >= 0),
balance REAL,
code INTEGER NOT NULL
);
插入新行時,我希望balance新行的值能夠反映OLD balance NEW amount。但是這個觸發器不能識別滯后balance值,我不知道為什么:
CREATE TRIGGER trg_accounts_balance
AFTER INSERT ON accounts
BEGIN
UPDATE accounts
SET balance = (
SELECT
lag(balance, 1, 0) OVER (
PARTITION BY code
ORDER BY month
) NEW.amount
FROM accounts
)
WHERE rowid = NEW.ROWID;
END;
如果我每月插入一行,我希望我的資料如下所示:
| 年 | 月 | 數量 | 平衡 | 代碼 |
|---|---|---|---|---|
| 2022 | 1 | 100.0 | 100.0 | 100 |
| 2022 | 2 | 9.99 | 109.99 | 100 |
但我得到:
| 年 | 月 | 數量 | 平衡 | 代碼 |
|---|---|---|---|---|
| 2022 | 1 | 100.0 | 100.0 | 100 |
| 2022 | 2 | 9.99 | 9.99 | 100 |
我究竟做錯了什么?
uj5u.com熱心網友回復:
查詢:
SELECT
lag(balance, 1, 0) OVER (
PARTITION BY code
ORDER BY month
)
FROM accounts
回傳與表中一樣多的行,并且 SQLite 選擇第一行(無論它是什么)將其作為結果回傳,以便它可以使用它來添加NEW.amount.
沒有任何東西可以將此值鏈接到插入的特定行。
相反,使用這個:
CREATE TRIGGER trg_accounts_balance
AFTER INSERT ON accounts
BEGIN
UPDATE accounts
SET balance = COALESCE(
(
SELECT balance
FROM accounts
WHERE code = NEW.code
ORDER BY year DESC, month DESC
LIMIT 1, 1
), 0) NEW.amount
WHERE rowid = NEW.ROWID;
END;
子查詢通過對特定降序的行進行排序code并跳過頂行(即新行)來回傳先前插入的行。
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510180.html
上一篇:將收藏夾專案保存到房間資料庫時出現問題,已保存重復專案并且無法檢查它是否也已保存
下一篇:設計關聯表中的主鍵
