sql - 多次插入 PostgreSQL

标签 sql postgresql

我正在尝试从 1 个 sql 查询执行多个插入。分解我在这里要做的是数据库结构:

links:
  - id // uuid_generate_v4()
  - hash

permissions:
  - id // uuid_generate_v4()
  - name

photos:
  - id // uuid_generate_v4()
  - url

link_permissions:
  - link_id
  - permission_id

link_photo:
  - link_id
  - photo_id

现在,每当我插入一个链接时,我还需要插入它的权限和照片。这是我到目前为止尝试过的 sql 查询。

WITH link as (
    INSERT INTO links(hash) VALUES ('my-random-hash') 
    RETURNING *
) 
INSERT INTO link_photo(link_id, photo_id) 
VALUES ((select link.id from link), '095ccacf-ebc1-4991-8ab0-cac13dac02b7'), 
INSERT INTO link_permission(link_id, permission_id) 
VALUES ((select link.id from link), '506f3302-fe9f-4982-8439-d6781f646d01')

WITH link as (
  INSERT INTO links(hash) VALUES ('my-random-hash') 
  RETURNING *
) 
(INSERT INTO link_photo(link_id, photo_id) 
  VALUES ((select link.id from link), '095ccacf-ebc1-4991-8ab0-cac13dac02b7')), 
 INSERT INTO link_permission(link_id, permission_id) 
 VALUES ((select link.id from link), '506f3302-fe9f-4982-8439-d6781f646d01')

我将如何编写此查询?

最佳答案

只需将第二个插入到另一个 CTE 中:

WITH link as (
    INSERT INTO links(hash) VALUES ('my-random-hash') 
    RETURNING *
) , lp as (
  INSERT INTO link_photo(link_id, photo_id) 
  VALUES ((select link.id from link), '095ccacf-ebc1-4991-8ab0-cac13dac02b7')
)
INSERT INTO link_permission(link_id, permission_id) 
VALUES ((select link.id from link), '506f3302-fe9f-4982-8439-d6781f646d01');

或者,不要使用 values,这会使查询更容易阅读(我认为)

WITH link as (
    INSERT INTO links(hash) VALUES ('my-random-hash') 
    RETURNING *
) , lp as (
  INSERT INTO link_photo(link_id, photo_id) 
  select id, '095ccacf-ebc1-4991-8ab0-cac13dac02b7'
  from link
)
INSERT INTO link_permission(link_id, permission_id) 
select id, '506f3302-fe9f-4982-8439-d6781f646d01'
from link;

关于sql - 多次插入 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49370462/

相关文章:

linux - 如何使用 .pgpass 文件中给出的密码连接到 postgres?

mysql - 将特定行从一个表更新到另一个表

php - INSERT IGNORE 上的主键自动递增

sql - Postgresql,从 json 数组中检索特定键的值

macos - 如何在 OS 10.6 (Snow Leopard) 上解决此 PostgreSQL 错误

postgresql - 使用 st_dwithin 限制将 table raw 分成 Postgres 中的 block

sql - 跨多个表添加序列值

mysql - 我怎样才能找到比率?

sql - 如何使用 groupby 和聚合函数将 SQL 查询中的行数作为单个数字返回?

postgresql - 可重用的唯一行 ID