2017-03-04 5 views
1

어떻게 SQL 쿼리를 만들 수 나는 다음과 같은 데이터가

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

을 삽입 할 필요가

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) 
); 

다음 표를 받아 반환 된 ID로 다 대다 관계 테이블에 삽입하는 장르 ID 및 삽입 된 앨범의 ID를 사용하여 album_genre에 삽입합니다.

+0

다시 [이전 해결책] (http://stackoverflow.com/questions/42579443/how-to-avoid-inserting-null-values-in-postgres-database)과 동일하지만 완전히 다른 방식이 필요합니다. 솔루션은 삽입 데이터가 메모리 또는 테이블에 있는지 여부에 따라 달라집니다. –

+1

@ vitaly-t 삽입 할 모든 데이터는 테이블에있는 장르 ID를 포함하여 클라이언트 API에서 게시 된 데이터로 전송됩니다. – malimichael

+0

그런 경우 Gordon Linoff의 첫 번째 솔루션이 적합합니다. –

답변

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이 고유한지 가정 상황에 대한 다음 작품은 당신이 설명합니다. 삽입 된 행을 원본 데이터와 일치 시키려면 고유 식별자가 필요합니다.

+0

삽입 데이터가 테이블에 있고 메모리에없는 것으로 가정하고 작성자가 다시 공개하지 못한다고 가정합니다. –

+0

고맙습니다. 아직까지는 프로그래밍에 익숙하지 않았습니다. CTE에 대한 연구를해야 할 것입니다. – malimichael