2017-03-04 1 views
1

Nehmen Sie die folgenden TabellenEinfügen in many-to-many-Beziehung Tabelle mit einem zurück 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) 
); 

Ich habe folgende Daten

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

eingefügt werden Wie kann ich eine SQL-Abfrage konstruieren, die fügt die Albumdaten ein und fügt sie unter Verwendung der Genre-IDs und der eingegebenen Album-ID in album_genre ein

+0

Wieder dasselbe wie in [Ihre vorherige Lösung] (http://stackoverflow.com/questions/42579443/how-to-avoid-inserting-null-values-in-postgres-database), erfordert es völlig anders Lösungen, abhängig davon, ob die Einfügedaten im Speicher oder in einer Tabelle sind. –

+1

@ vitaly-t Alle einzufügenden Daten stammen von den vom Kunden geposteten Daten an meine API, einschließlich der Genre-IDs, die ebenfalls in der Tabelle vorhanden sind. – malimichael

+0

In diesem Fall ist die erste Lösung von Gordon Linoff geeignet. –

Antwort

2

In Postgres könnten Sie die Abfrage mit inserts in CTEs erstellen. Folgende Arbeiten für die Situation, die Sie beschreiben:

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

für mehrere Zeilen, die gleichen Arbeiten konstruieren, sondern geht davon aus, dass duration einzigartig ist. Sie benötigen eine eindeutige Kennung, um die eingefügten Zeilen mit den Originaldaten abzugleichen.

+0

Angenommen, dass die Daten in einer Tabelle und nicht im Speicher eingefügt werden, was der Autor wiederum nicht bekannt gibt. –

+0

Danke das funktioniert, immer noch sehr neu in der Programmierung, nicht so sicher, warum! Ich werde sicher einige CTE's erforschen. – malimichael

Verwandte Themen