当前位置: 首页 > 知识库问答 >
问题:

在不存在PostgresQL的地方插入多行

杨俊茂
2023-03-14

我想生成一个sql查询来批量插入一系列表中不存在的行。我当前的设置为每个记录插入创建了一个新的查询,类似于PostgreSQL中WHERE NOT EXISTS in PostgreSQL Gets syntax error中详细介绍的解决方案,但我想将其移动到单个查询以优化性能,因为我当前的设置一次可以生成几百个查询。现在我正在尝试下面添加的示例:

INSERT INTO users (first_name, last_name, uid) 
SELECT ( 'John', 'Doe', '3sldkjfksjd'), ( 'Jane', 'Doe', 'adslkejkdsjfds')
WHERE NOT EXISTS (
  SELECT * FROM users WHERE uid IN ('3sldkjfksjd', 'adslkejkdsjfds')
)

Postgres返回以下错误:

PG::Error: ERROR:  INSERT has more target columns than expressions

问题是,PostgresQL在使用SELECT时似乎不想接受一系列值。相反,我可以使用值进行插入,但我无法阻止使用不存在的值生成重复项。

http://www.techonthenet.com/postgresql/insert.php在“示例-使用SUB-SELECT”一节中,建议使用SELECT从另一个引用表插入多条记录,因此我想知道为什么我似乎无法传递一系列要插入的值。我传递的值来自外部API,所以我需要生成手动插入的值。

共有2个答案

堵存
2023-03-14

答案为_no _name的_horse _实际上有一个语法错误,缺少最后一个右括号,但除此之外,这是正确的方法。

更新:对于像我这样遇到这种情况的人,如果你有需要类型转换的列(例如第9.5页中的时间戳、UUID或jsonb),你必须在传递给查询的值中声明:

-- insert multiple if not exists
-- where another_column_name is of type uuid, with strings cast as uuids
-- where created_at and updated_at is of type timestamp, with strings cast as timestamps
WITH data (id, some_column_name, another_column_name, created_at, updated_at) AS (
  VALUES
    (<id value>, <some_column_name_value>, 'a5fa7660-8273-4ffd-b832-d94f081a4661'::uuid, '2016-06-13T12:15:27.552-07:00'::timestamp, '2016-06-13T12:15:27.879-07:00'::timestamp),
    (<id value>, <some_column_name_value>, 'b9b17117-1e90-45c5-8f62-d03412d407dd'::uuid, '2016-06-13T12:08:17.683-07:00'::timestamp, '2016-06-13T12:08:17.801-07:00'::timestamp)
)
INSERT INTO table_name (id, some_column_name, another_column_name, created_at, updated_at)
SELECT d.id, d.survey_id, d.arrival_uuid, d.gf_created_at, d.gf_updated_at
FROM data d
WHERE NOT EXISTS (SELECT 1 FROM table_name t WHERE t.id = d.id);

一匹没有名字的马救了我今天的一个项目,但我不得不做出这些调整,使之完美。

温开畅
2023-03-14

你的select没有做你认为它做的事情。

PostgreSQL中最紧凑的版本应该是这样的:

with data(first_name, last_name, uid)  as (
   values
      ( 'John', 'Doe', '3sldkjfksjd'),
      ( 'Jane', 'Doe', 'adslkejkdsjfds')
) 
insert into users (first_name, last_name, uid) 
select d.first_name, d.last_name, d.uid
from data d
where not exists (select 1
                  from users u2
                  where u2.uid = d.uid);

这相当于:

insert into users (first_name, last_name, uid) 
select d.first_name, d.last_name, d.uid
from (
   select 'John' as first_name, 'Doe' as last_name, '3sldkjfksjd' as uid
   union all
   select 'Jane', 'Doe', 'adslkejkdsjfds'
) as d
where not exists (select 1
                  from users u2
                  where u2.uid = d.uid);
 类似资料:
  • 问题内容: 我尝试插入新用户(如果用户表中不存在该用户),我尝试了此查询,但收到错误: 如果不存在,如何插入用户? 错误: 谢谢, 问题答案: 用途: 我可以这样写: 但是更好的方法可能只是放入一个唯一索引,以便数据库保护数据:

  • 我有一个我认为是完全琐碎的查询-插入值到一个表中,如果一个值与匹配的ID不存在: 我在where语句周围得到一个错误。为什么?我如何实现我的目标?

  • 问题内容: 我想将插入查询与“不存在的地方”组合起来,以免违反PK约束。但是,如下所示的语法给我一个错误- 我该怎么做? (通常,您可以将插入内容与where子句结合使用吗?) 问题答案: 编辑: 阅读马丁斯链接后,如果承认,最好的解决方案是:

  • 问题内容: 如果条目不存在,我想将数据插入多个表中。 就我而言,我有一个餐厅表,一个位置表,一个表以及一些辅助表,例如和。现在,我想插入一个新的餐厅条目,其中包含位置和食物类型信息(如果该条目不存在)。 所以像这样: 如何使用简单的SQL执行此操作? 问题答案: 我只是在脑海中写下了这个,但是如果您必须使用简单的sql来做的话,这应该是个主意。 编辑: 同样,我无法解析它,但您可能可以使用WITH

  • 现在我有了hibernate的工作批插入(“hibernate.jdbc.batch_size=50”),但据我所知,hibernate会批量生成单个插入。我知道我可以告诉我的db驱动程序为每批插入创建多行插入,以使用rewriteBatchedStatements:jdbc:p加快性能ostgresql://localhost:5432/mydb?rewriteBatchedStatements

  • 我是新使用PostgreSQL的,我正在尝试从spring jdbc插入值。这是我的问题 我的代码如下 当我为上述方法执行测试用例时,我得到的错误如下: 组织。springframework。jdbc。BadSqlGrammarException:StatementCallback;错误的SQL语法[插入卖家(卖家ID、名字、姓氏、锡号、公司名称、公司标识、EPCH号、VAT号、CST号、佣金、状