我有表TableAAA、TableBBB和。這些表有一列:TableCCCTableCollectedAAA/BBB/CCCDateTime
table_aaa: DateTime modified
table_bbb: DateTime modified
table_ccc: DateTime modified
我想在插入/更新后運行的每個表上都有一個 1-1 觸發器。它應該DateTime將給定表中最大的值保存到TableCollected表中。因此,如果TableAAAtable 包含 3 行帶 dates 1980-01-01,1990-01-01然后我會有一行包含 table2010-01-01的TableCollected名稱(或一些識別符號,如果我必須設定它也沒關系)和最大的 date table_collected: name (table_aaa), modified (2010-01-01)。
如果TableBBB有帶有 , 的行1999-01-01,2012-04-01則TableCollected應該有 2 行:
name datetime
table_aaa 2010-01-01
table_bbb 2012-04-01
所以TableCollected會持有最大DateTime的其他桌子。它應該只包含每個表的DateTime值一次。它name是唯一的,如果它插入一次,則每次在表中插入新行AAA/BBB/CCC并且modified值大于舊值時,它都應該更新。
uj5u.com熱心網友回復:
您需要為每個表創建 3 個觸發器,一個用于插入,一個用于更新,一個用于洗掉(如果最近修改的記錄被洗掉):
CREATE TRIGGER table_aaa_insert AFTER INSERT ON table_aaa
BEGIN
INSERT OR REPLACE INTO TableCollected (name, modified)
SELECT 'table_aaa', max(modified) FROM table_aaa;
END;
CREATE TRIGGER table_aaa_update AFTER UPDATE ON table_aaa
BEGIN
INSERT OR REPLACE INTO TableCollected (name, modified)
SELECT 'table_aaa', max(modified) FROM table_aaa;
END;
CREATE TRIGGER table_aaa_delete AFTER DELETE ON table_aaa
BEGIN
INSERT OR REPLACE INTO TableCollected (name, modified)
SELECT 'table_aaa', max(modified) FROM table_aaa;
END;
請注意,name必須是主鍵或唯一欄位TableCollected才能利用INSERT OR REPLACE
但是,根據對這些表的插入/更新/洗掉操作的速率,將 TableCollected 表替換為動態回傳所需值的視圖可能會更有效:
CREATE VIEW TableCollected (name, modified) as
SELECT 'table_aaa', max(modified) from table_aaa
UNION ALL
SELECT 'table_bbb', max(modified) from table_bbb
UNION ALL
SELECT 'table_ccc', max(modified) from table_ccc;
在這兩種解決方案中,表 aaa、bbb 和 ccc 中的欄位索引modified都會有利于提高性能。
編輯:再想一想,每次插入或更新記錄時不需要計算 max(modified) 的更有效方法是:
CREATE TRIGGER table_aaa_insert AFTER INSERT ON table_aaa
BEGIN
UPDATE TableCollected SET modified=NEW.modified WHERE name='table_aaa' AND modified<NEW.modified;
END;
CREATE TRIGGER table_aaa_update AFTER UPDATE ON table_aaa
BEGIN
UPDATE TableCollected SET modified=NEW.modified WHERE name='table_aaa' AND modified<NEW.modified;
END;
DELETE 觸發器不會改變,因為在這種情況下,您無論如何都需要搜索 max(modified)。
請注意,此解決方案需要為每個表預先填充 TableCollected 一行。另請注意,在觸發器modified中指的是 TableCollected 欄位,并且NEW.modified指的是剛剛插入或更新的 table_aaa 欄位。
uj5u.com熱心網友回復:
你的問題的答案是肯定的。以下是官方檔案中的示例:
CREATE TRIGGER update_customer_address UPDATE OF address ON customers
BEGIN
UPDATE orders SET address = new.address WHERE customer_name = old.name;
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514001.html
標籤:sqlsqlite
