SQL检查是不是存在并插入[重复]
Posted
技术标签:
【中文标题】SQL检查是不是存在并插入[重复]【英文标题】:SQL check if exists and insert [duplicate]SQL检查是否存在并插入[重复] 【发布时间】:2022-01-01 07:18:57 【问题描述】:我正在使用具有以下架构的表“客户”
id INTEGER NOT NULL UNIQUE,
name TEXT NOT NULL,
auth BOOLEAN DEFAULT FALSE
现在,我想添加一条记录,如果不存在,我可以执行以下操作
IF NOT EXISTS (SELECT name from Customer where id=220)
BEGIN
INSERT into Customer (name,id) values ('Jon', 220)
END;
但同时,我也想知道 id 是否真的与插入一起不存在,即选择查询的 True/False 结果。我可以将它分成两个查询,从第一个我可以知道它是否存在,如果 id 不存在,那么我可以插入它。但是如何在单个查询中做到这一点?
【问题讨论】:
【参考方案1】:您需要将INSERT
与RETURNING
子句一起使用(PostgreSQL INSERT)。
【讨论】:
【参考方案2】:您可以使用以下内容:
INSERT into Customer SELECT 'Jon', 220
Where Not EXISTS (SELECT 1
from Customer
where id=220);
Select Cast(@@ROWCOUNT as bit);
【讨论】:
Cast(@@ROWCOUNT as bit);
对 Postgres 无效【参考方案3】:
可以自定义与 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)
【讨论】:
以上是关于SQL检查是不是存在并插入[重复]的主要内容,如果未能解决你的问题,请参考以下文章
DataTable update() 插入重复的新行而不检查它是不是存在
如何在插入 MySQL 之前检查表中是不是存在名称 [重复]