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】:

您需要将INSERTRETURNING 子句一起使用(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 之前检查表中是不是存在名称 [重复]

检查表是不是存在sql server [重复]

MySQL 触发器在插入后检查是不是没有重复然后运行 ​​sys_exec udf

如何使用 SQL 来查看表是不是存在? [复制]

检查目录是不是存在并计算与其中模式匹配的文件[重复]