如果不存在条目,则使用PostgreSQL多个插入[英] Multiple Inserts with PostgreSQL if an entry does not exist

本文是小编为大家收集整理的关于如果不存在条目,则使用PostgreSQL多个插入的处理方法,想解了如果不存在条目,则使用PostgreSQL多个插入的问题怎么解决?如果不存在条目,则使用PostgreSQL多个插入问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

如果不存在条目,我想将数据插入多个表.

就我而言,我有一张餐厅桌,位置表,foodtype桌子和一些助手桌,例如restaurant_location和restaurant_foodtype.现在,我想插入一个新的餐厅条目,其中包含该位置和FoodType信息(如果不存在).

所以类似:

IF NOT (select 1 from restaurant where name='restaurantname') THEN
 INSERT INTO restaurant(x,y) VALUES (valuex,valuey);
 INSERT INTO restaurant_location(rest_id,..) VALUES (rest_id,..);
 INSERT INTO restaurant_foodtype(rest_id,..) VALUES (rest_id,..);
 ...
END IF

如何使用简单的SQL?

进行此操作

推荐答案

我只是在我的头顶上写这篇文章,但这应该是想法,如果您必须使用简单的SQL进行.

insert into 
    restaurant(x, y)
values
    select valuex, valuey 
    from dual
    where
      not exists(
        select 1 from restaurant where name = 'restaurantname')

编辑: 同样,我无法解析,但是您可能可以使用WAND句子:

with validation as(
  select 1 from restaurant where name = 'restaurantname'
)
insert into 
    restaurant(x, y)
values
    (
     select value1x, value1y 
     from dual
     where
       validation.v = 1),
    (
     select value2x, value2y 
     from dual
     where
       validation.v = 1)

其他推荐答案

在Postgres 9.1或更高版本您可以使用 data-modifying ctes 使它快速,安全,简单和优雅:

WITH x AS (
   INSERT INTO restaurant(name, x, y)
   SELECT 'restaurantname', valuex, valuey
   WHERE  NOT EXISTS (SELECT 1 FROM restaurant WHERE name = 'restaurantname')
   RETURNING rest_id     -- returns auto-generated id (from sequence)
   )
, y AS (
   INSERT INTO restaurant_location(rest_id, ...)
   SELECT rest_id, ...
   FROM   x              -- only produces rows after a successful INSERT
   )

   --- more chained INSERTs here?

INSERT INTO restaurant_foodtype(rest_id, ...)
SELECT rest_id, ...
FROM   x;

仅当找不到'餐厅名称'时,第一个INSERT才能执行.如果多个查询在同一实例中应该尝试相同的话,就会有一个超细的种族条件.如果您对restaurant.name有UNIQUE的约束(就像您应该从描述中判断),那么最糟糕的情况是,在同意查询中,只有第一个会成功,而其他人则以独特的违规行为(无所事事)返回.但是,您永远不会看到这一点,因为这不太可能发生.

RETURNING子句返回自动生成的rest_id - 我假设rest_id是串行列.

以下INSERT查询仅在第一个成功时生成行.

用平原INSERT完成系列赛.

使用PostgreSQL 8.1,我会编写PLPGSQL函数以实现相同的功能.
但是,实际上,您最好升级到当前版本.

本文地址:https://www.itbaoku.cn/post/1764027.html