2017-03-04 89 views
1

看看下面的表格插入到许多一对多的关系表返回的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

+0

同样,在[你以前的解决方案](http://stackoverflow.com/questions/42579443/how-to-avoid-inserting-null-values-in-postgres-database),它需要完全不同解决方案,取决于插入数据是在内存中还是在表中。 –

+1

@ vitaly-t所有要插入的数据都来自客户端发布的数据到我的API,包括也存在于表中的流派ID。 – malimichael

+0

在这种情况下,Gordon Linoff的第一个解决方案是合适的。 –

回答

2

在Postgres里插入到album_genre,你可以构建热膨胀系数使用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是独一无二的。您需要一个唯一的标识符来将插入的行与原始数据进行匹配。

+0

假设插入数据在表中,而不在内存中,作者再次未公开。 –

+0

感谢这个工程,编程仍然很新,所以不太确定为什么!我一定会对CTE做一些研究。 – malimichael