2019-09-23

SQL : WITH RECURSIVE ... REPLACE INTO ...

SQL : WITH RECURSIVE ... REPLACE INTO ...
INSERT INTO 不會做資料插入前的檢查,發生錯誤就中斷程式。
在程式開發的過程,時常會遇到一個情境:
如果資料不存在,就插入一筆資料;如果資料已經存在,就更新這一筆資料。
INSERT INTO 衍申的語法:REPLACE INTO 剛好可以滿足這個需求,但資料表必須有主鍵PRIMARY KEY,資料會透過所提供的PRIMARY KEY鍵值,來決定要增加一筆資料?還是更新這筆資料?

目標:
  1. 延續上一篇:SQL : WITH RECURSIVE ... INSERT INTO ... http://blog.bod.idv.tw/2019/09/sql-with-recursive-insert-into.html ,這完成INSERT INTO 相關的資料後,這這裡繼續做REPLACE INTO的動作。
  2. 在 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')
作法:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. 在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;
  4. 執行SQL指令:(F9) Execute SQL,Status : 確認SQL指令 WITH RECURSIVE ... REPLACE INTO ... 執行無誤
  5. 查看執行結果
    score=4, (4,'aaaa') 已更新為 (4, 'b')
    score=5, (5,'aaaaa') 已更新為 (5, 'bb')
    已插入 (6,'bbb'), (7,'bbbb'), (8,'bbbbb')

沒有留言: