2017-03-04 117 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