Trigger

SQLite:在觸發器中使用計數來更新另一列

  • January 31, 2021

更新:已修復。不是 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 errorcould 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()並試圖添加HAVINGGROUP 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<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/284368