PostgreSQL 教程: 使用 DBeaver 合并数据

十月 26, 2023

摘要:在本教程中,您将学习如何使用 DBeaver 将文件中的数据合并到 PostgreSQL 表。

有时,在某些情况下,您希望在导入表时忽略当前主键值。除了 INSERT INTO 语法之外,PostgreSQL 还支持 “ON CONFLICT DO NOTHING” 和 “ON CONFLICT DO UPDATE SET” 形式的合并插入语法。

插入示例:

“ON CONFLICT DO NOTHING”

INSERT INTO language_insert(language_id, name, last_update) 
VALUES(1, 'English', '2006-02-15 05:02:19.0') ON CONFLICT DO NOTHING;

“ON CONFLICT DO UPDATE SET”

INSERT INTO language_insert(language_id, name, last_update) 
VALUES(1, 'English', '2006-02-15 05:02:19.0') 
ON CONFLICT (language_id) 
DO UPDATE SET (language_id, name, last_update) = (EXCLUDED.language_id, EXCLUDED.name, EXCLUDED.last_update);

替换方法的选择,在导入设置里面的 “数据加载设置” 中。

img

默认情况下,选择为<None>,您可以从下拉列表中选择其他选项。可用选项还有忽略模式 “ON CONFLICT DO NOTHING” 和替换模式 “ON CONFLICT DO UPDATE SET”。

img

让我们看一个示例来了解其工作原理。我们使用一个小的、简单的、稍微修改过的 Sakila 表 - sakila.language。

CREATE TABLE language_insert (
  language_id smallint NOT NULL,
  name char(20) NOT NULL,
  last_update timestamp NOT NULL,
  PRIMARY KEY (language_id)
);

INSERT INTO sakila.language_insert (language_id, name, last_update) VALUES
(1,'English','2006-02-15 05:02:19.0'),
(2,'Italian','2006-02-15 05:02:19.0'),
(3,'Japanese','2006-02-15 05:02:19.0'); 

如果我们尝试执行该插入操作两次,我们将收到以下错误:

ERROR:  duplicate key value violates unique constraint "language_insert_language_id_pkey"
DETAIL:  Key (language_id)=(1) already exists.

让我们创建一个包含以下内容的 CSV 文件,并尝试使用替换方法合并数据。

"language_id","name","last_update"
1,Spanish,"2020-04-20 05:02:19.0"
2,Russian,"2020-05-20 05:02:19.0"
3,Belgian,"2020-06-20 05:02:19.0"
4,Mandarin,"2006-02-15 05:02:19.0"
5,French,"2006-02-15 05:02:19.0"
6,German,"2006-02-15 05:02:19.0"

如果我们在数据加载设置中选择忽略模式 “ON CONFLICT DO NOTHING”,则插入的结果将如下所示:

img

不会出现插入错误,前三行不会改变,第四到第六行将添加到表格中。

如果我们在数据加载设置中选择替换模式 “ON CONFLICT DO UPDATE SET”,插入的结果将如下所示:

img

不会出现插入错误,前三行将被替换,第四至第六行将添加到表中。