共計 1057 個字符,預計需要花費 3 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
新遇到一個業務需求,往 postgresql 中插入數據的時候需滿足:如果數據庫存在這條記錄,則進行修改;不存在則進行插入。
Oracle 中可以用 merge 來解決。Pg 中之前沒做過類似操作,百度查了一下,PostgreSQL 9.5 版本帶來了一個新特性:UPSERT。UPSERT 是 INSERT, ON CONFLICT UPDATE 的簡寫,簡而言之就是:插入數據,正常時寫入,主鍵沖突時更新。
示例來看一下:
一張測試表,結構如下:
yqm=# \d student;
Table public.student
Column | Type | Modifiers
——–+———————–+———–
id | integer |
name | character varying(20) |
Indexes:
id_cons UNIQUE CONSTRAINT, btree (id)
目前數據如下:
yqm=# select * from student;
id | name
—-+——
1 | a
2 | b
3 | c
(3 rows)
要插入的表要有一條唯一性約束,不然會報如下錯:
yqm=# insert into student values(4, d) on conflict(id) do update set name= as
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
如果存在這種報錯,需要創建一條唯一性約束
yqm=# alter table student add constraint id_cons unique(id);
ALTER TABLE
再次插入
yqm=# insert into student values(4, d) on conflict(id) do update set name= as
INSERT 0 1
查看結果,已經新增了
yqm=# select * from student;
id | name
—-+——
1 | a
2 | b
3 | c
4 | d
(4 rows)
再次執行,會做更改操作
yqm=# insert into student values(4, d) on conflict(id) do update set name= as
INSERT 0 1
yqm=# select * from student;
id | name
—-+——
1 | a
2 | b
3 | c
4 | as
(4 rows)
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!