使用返回的id插入多对多关系表

时间:2017-03-04 13:14:28

标签: sql postgresql pg-promise

采取以下表格

CREATE TABLE album(
  id SERIAL PRIMARY KEY NOT NULL,
  duration INTEGER NOT NULL
);

CREATE TABLE genre(
  id SERIAL PRIMARY KEY NOT NULL,
  name VARCHAR(32) NOT NULL
);

CREATE TABLE album_genre(
  album_id REFERENCES album(id),
  genre_id REFERENCES genre(id)
);

我要插入以下数据

const album = {
  duration: 12345
  genre1Id: 1,
  genre2Id: 2,
  genre3Id: 3
}

我如何构建一个插入专辑数据的SQL查询,然后使用类型ID和插入的专辑ID

插入album_genre

1 个答案:

答案 0 :(得分:2)

在Postgres中,您可以使用CTE中的inserts构建查询。以下适用于您描述的情况:

with data(duration, genre1Id, genre2Id, genre3Id) as (
      values(12345, 1, 2, 3)
     ),
     i as (
      insert into albums(duration)
          select duration
          from data
          returning *
     )
insert into album_genre (album_id, genre_id)
    select i.id, v.genre
    from i join
         data d
         on i.duration = d.duration, lateral
         (values (d.genre1Id), (d.genre2Id), (d.genre3Id)) v(genre);

对于多行,相同的构造有效,但假设duration是唯一的。您需要一个唯一的标识符来匹配插入的行与原始数据。

相关问题