可以自定义与 INSERT 一起使用的“on conflict”子句以满足您的目的。
INSERT INTO <table_name>(<column_name_list)) values(<column_values>) ON CONFLICT(<constraint_column>) DO NOTHING;
参考:https://www.postgresqltutorial.com/postgresql-upsert/
设置
第 1 步:创建表:
create table test
(
id INTEGER NOT NULL UNIQUE,
name TEXT NOT NULL,
auth BOOLEAN DEFAULT FALSE
);
第 2 步:加载包含一些示例行的表:
insert into test(id,name) values(1,'vincent'),(2,'gabriel'),(3,'sebastian');
第 3 步:使用现有 id 即 1 的行的 INSERT 进行测试,插入不会通过,因为 ID 已经存在:
INSERT INTO test(id,name) values(1,'xavier') ON CONFLICT(id) DO NOTHING;
第 4 步:现在使用 ID 不存在的行进行测试。即 4。它通过了。
INSERT INTO test(id,name) values(4,'xavier') ON CONFLICT(id) DO NOTHING;
演示:
postgres=# select * from test;
id | name | auth
----+-----------+------
1 | vincent | f
2 | gabriel | f
3 | sebastian | f
(3 rows)
postgres=# INSERT INTO test(id,name) values(1,'xavier') ON CONFLICT(id) DO NOTHING;
INSERT 0 0
postgres=#
postgres=# select * from test;
id | name | auth
----+-----------+------
1 | vincent | f
2 | gabriel | f
3 | sebastian | f
(3 rows)
--- NOTE: no row inserted as ID 1 already exists.
postgres=# INSERT INTO test(id,name) values(4,'xavier') ON CONFLICT(id) DO NOTHING;
INSERT 0 1
postgres=# select * from test;
id | name | auth
----+-----------+------
1 | vincent | f
2 | gabriel | f
3 | sebastian | f
4 | xavier | f -------> new row inserted.
(4 rows)