如何在一个查询中对 postgresql 数据库执行多次插入

Dav*_*ien 2 postgresql insert

我有一个订单、收件人和项目表。

我想根据上一个查询的响应将数据插入到每个表中。

insert into recipient(name, address) values(name, address);
insert into orders(recipient_id, total_price, total_quantity) values(recipient_id, 2000, 20);
insert into items(order_id, item, price, quantity, total) values(order_id, item1, 230, 2, 260);
insert into items(order_id, item, price, quantity, total) values(order_id, item2, 500, 2, 1000);
Run Code Online (Sandbox Code Playgroud)

我想在单个 PostgreSQL 查询中执行此操作。

这是我尝试过的

insert into users (fullname, email, phone, address, status)
  values ('Mine Essien', 'davidessienshare@gmail.com', '08167462431', 'Andela Epic tower Lagos')
  returning id as recipient_id
)

new_order AS(
  insert into orders(user_id, recipient_id, quantity, total_cost)
  values(1, recipient_id, 5, 9500)
  returning id as order_id
)
new_item as (insert into items(order_id, item, quantity, price, total) values(order_id, 'Pepper soup', 2, 2500, 5000), values(order_id, 'Ishiewu', 1, 5000, 5000), values(order_id, 'Fried yam', 2, 2000, 4000);
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 5

似乎您的表是用serialoridentity列定义的,并且您希望使用从一次插入中生成的值作为下一条语句中的外键。这确实可以使用数据修改 CTE结合returning子句来完成:

with new_recipient as (
  insert into recipient
    (name, address) 
  values
    (name, address)
  returning recipient_id
), new_order as (
  insert into orders
     (recipient_id, total_price, total_quantity) 
  values
     ((select * from new_recipient), 2000, 20)
  returning order_id
)
insert into items 
  (order_id, item, price, quantity, total) 
values
  ((select * from new_order), 'item1', 230, 2, 260), 
  ((select * from new_order) , 'item2', 500, 2, 1000);
Run Code Online (Sandbox Code Playgroud)

然而,这也可以使用三个不同的插入语句来完成:

into recipient
  (name, address) 
values
  (name, address);

insert into orders
   (recipient_id, total_price, total_quantity) 
values
   (lastval(), 2000, 20);

insert into items 
  (order_id, item, price, quantity, total) 
values
  (lastval(), 'item1', 230, 2, 260), 
  (lastval(), 'item2', 500, 2, 1000);
Run Code Online (Sandbox Code Playgroud)

该函数lastval()返回最近生成的序列号。因此,在第二个插入中,这将是and in the third statement it would be thereceiver_id order_id`。