【问题标题】: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 不存在,那么我可以插入它。但是如何在单个查询中做到这一点?

【问题讨论】:

    标签: sql postgresql


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多