使用返回的 ID 插入多对多关系 table
Inserting into many-to-many relationship table with a returned id
取下表
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
在 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
是唯一的。您需要一个唯一标识符来将插入的行与原始数据相匹配。
取下表
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
在 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
是唯一的。您需要一个唯一标识符来将插入的行与原始数据相匹配。