十月 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);
替换方法的选择,在导入设置里面的 “数据加载设置” 中。
默认情况下,选择为<None>
,您可以从下拉列表中选择其他选项。可用选项还有忽略模式 “ON CONFLICT DO NOTHING” 和替换模式 “ON CONFLICT DO UPDATE SET”。
让我们看一个示例来了解其工作原理。我们使用一个小的、简单的、稍微修改过的 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”,则插入的结果将如下所示:
不会出现插入错误,前三行不会改变,第四到第六行将添加到表格中。
如果我们在数据加载设置中选择替换模式 “ON CONFLICT DO UPDATE SET”,插入的结果将如下所示:
不会出现插入错误,前三行将被替换,第四至第六行将添加到表中。