SQLite:在觸發器中使用計數來更新另一列
更新:已修復。不是 100% 確定為什麼 sqlfiddle.com 不喜歡我的語法,但是使用https://dbfiddle.uk/?rdbms=sqlite_3.27有效。我確實將最後一個
WHERE
子句更改為基於id
列,因此它只更新目前記錄,並遞增而不是在記錄上儲存 max()username
。我正在嘗試並未能執行此處所述的類似操作(但在 SQLite 中): Using count in triggers to update another table。
我認為觸發器是實現我想要的最佳方式,但我願意接受其他建議。至少可以說,我的 SQL 經驗是有限的。
我的目標是有一個帶有標識符的列,比如說
username
,另一列是次數的計數,在username
插入記錄時在數據庫中。id | username | u_cnt | etc 1 | MarkC | 0 | ... 2 | PeterB | 0 | ... 3 | MarkC | 1 | ...
這是我一直在嘗試的範例:
create trigger count_user after insert on rec_info begin update rec_info set u_cnt = ( select count(*) from rec_info where username = new.username ); end
我一直在抨擊https://sqlite.org/lang_createtrigger.html#syntax_restrictions_on_update_delete_and_insert_statements_within_triggers上的文件, 但我似乎無法弄清楚該
count_user
語句有什麼問題。根據我在哪裡測試它,我會得到以下之一near ")": syntax error
或could not prepare statement (1 incomplete input)
,這對我來說都不是那麼有用。我也嘗試過製作
u_cnt
一個生成/計算的列(https://sqlite.org/gencol.html),但試圖用以下方式聲明該列:u_cnt int as (count(username)) stored,
這給了我
misuse of aggregate function count()
並試圖添加HAVING
或GROUP BY
引導我進入一個讓我頭痛并且似乎並沒有帶來進步的兔子洞。
你的錯誤我無法重現,但我認為你想要這個作為你的觸發器。
MAX(u_cnt) + 1
也可以使用,只要插入僅0
用於u_cnt
CREATE TABLE rec_info ("id" INTEGER, "username" TEXT(6), "u_cnt" TEXT(6)) ;
create trigger count_user after insert on rec_info begin update rec_info set u_cnt = ( select COUNT(*) from rec_info where username = new.username) WHERE username = new.username; end
INSERT INTO rec_info ("id", "username", "u_cnt") VALUES (1, 'MarkC', '0') ;
INSERT INTO rec_info ("id", "username", "u_cnt") VALUES (2, 'PeterB', '0') ;
INSERT INTO rec_info ("id", "username", "u_cnt") VALUES (3, 'MarkC', '0') ;
INSERT INTO rec_info ("id", "username", "u_cnt") VALUES (4, 'MarkC', '0') ;
SELECT * FROM rec_info
編號 | 使用者名 | u_cnt -: | :------- | :---- 1 | 馬克C | 3 2 | 彼得B | 1 3 | 馬克C | 3 4 | 馬克C | 3
db<>在這裡擺弄