INSERT INTO 不會做資料插入前的檢查,發生錯誤就中斷程式。
在程式開發的過程,時常會遇到一個情境:
如果資料不存在,就插入一筆資料;如果資料已經存在,就更新這一筆資料。
INSERT INTO 衍申的語法:REPLACE INTO 剛好可以滿足這個需求,但資料表必須有主鍵PRIMARY KEY,資料會透過所提供的PRIMARY KEY鍵值,來決定要增加一筆資料?還是更新這筆資料?
目標:
- 延續上一篇:SQL : WITH RECURSIVE ... INSERT INTO ... https://sql.bod.idv.tw/2021/01/sql-with-recursive-insert-into.html ,這完成INSERT INTO 相關的資料後,這這裡繼續做REPLACE INTO的動作。
- 在 tabWith 已 INSERT INTO : (1,'a'), (2,'aa'), (3,'aaa'), (4,'aaaa'), (5,'aaaaa') 的情況下,要再繼續REPLACE INTO : (4,'b'), (5,'bb'), (6,'bbb'), (7,'bbbb'), (8,'bbbbb')
作法:
- 測試環境的資料庫,可以參閱以下網址連結來建立:
- 取得SQLite版本的Chinook範例資料庫 https://sql.bod.idv.tw/2021/01/sqlitechinook.html
- 用SQLiteStudio建立SQL學習環境 https://sql.bod.idv.tw/2021/01/sqlitestudiosql.html
- 確認 已完成 SQL : WITH RECURSIVE ... INSERT INTO ... https://sql.bod.idv.tw/2021/01/sql-with-recursive-insert-into.html
- 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
- 在Query分頁中輸入SQL的執行指令
WITH RECURSIVE cte AS ( SELECT 4 AS c1, 'b' AS c2 UNION ALL SELECT c1 + 1, c2 || 'b' FROM cte WHERE c1 < 8 ) REPLACE INTO tabWith (score, grade) SELECT c1, c2 FROM cte;
- 執行SQL指令:(F9) Execute SQL,Status : 確認SQL指令 WITH RECURSIVE ... REPLACE INTO ... 執行無誤
- 查看執行結果
score=4, (4,'aaaa') 已更新為 (4, 'b')
score=5, (5,'aaaaa') 已更新為 (5, 'bb')
已插入 (6,'bbb'), (7,'bbbb'), (8,'bbbbb')