2016-02-01 8 views
5

iam erstelle eine Tabelle mit dem Befehl unten in postgresql.füge eindeutige Werte in postgresql ein

CREATE TABLE someTable (
    id serial primary key, 
    col1 int NOT NULL, 
    col2 int NOT NULL, 
    unique (col1, col2) 
); 

dann führe ich 2 Einfügeanweisungen aus.

  1. insert into someTable (col1,col2) values(1,11),(1,12);

    seine Arbeit

  2. insert into someTable (col1,col2) values(1,13),(1,14),(1,11);

    erhielt Fehler (Schlüssel (col1, col2) = (1,11) ist bereits vorhanden.

Aber ich muss nur doppelte Paare vermeiden.Wie wird es möglich sein?

iam versuchen, dies mit

PostgreSQL 9.5.0 auf x86_64-pc-linux-gnu, zusammengestellt von gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, 64-Bit und PostgreSQL 9.3 auf x86_64-pc -linux-Gnu, von gcc (Ubuntu 4.8.2-19ubuntu1) kompiliert 4.8.2, 64-Bit-

aber ich habe Fehler

ich brauche ot so zu sagen nach zwei Anweisungen ausführen.

(1,11),(1,12),(1,13),(1,14) 
+0

Die zweite Einfügung versucht, die Werte '(1,11)' einzufügen, die Sie bereits mit der ersten Anweisung eingefügt haben. Und da Sie 'col1, col2' als eindeutig definiert haben, können Sie das gleiche Tupel nicht zweimal einfügen. –

+0

ist es möglich, alle anderen Werte einzufügen (Doppelpaare vermeiden). –

+0

Nicht mit Postgres 9.1, können Sie das mit Postgres 9.5 –

Antwort

3

Sie können diese insert . . . select mit tun:

insert into someTable(col1, col2) 
    select col1, col2 
    from (select 1 as col1, 13 as col2 union all 
      select 1, 14 union all 
      select 1, 11 
     ) t 
    where not exists (select 1 
         from someTable st 
         where st.col1 = t.col1 and st.col2 = t.col2 
        ); 

Das heißt, filtern Sie die Werte aus, bevor der insert.

EDIT:

Als a-Pferd-with-no-name darauf hinweist, können Sie auch diese schreiben wie:

insert into someTable(col1, col2) 
    select col1, col2 
    from (values (1, 13), (1, 14), (1, 11) 
     ) as t(col1, col2) 
    where not exists (select 1 
         from someTable st 
         where st.col1 = t.col1 and st.col2 = t.col2 
        ); 

Ich neige dazu, die union all Ansatz zu verwenden, da nicht alle Datenbanken dies unterstützen Verwendung der values()-Anweisung.

+1

Keine Notwendigkeit für die ausführliche 'select' in der abgeleiteten Tabelle. Sie können 'Werte (1,13), (1,14)' direkt dort verwenden –

+0

Ich habe Fehler von oben Syntax ERROR: Syntaxfehler bei oder nahe "von" LINE 2: von (Werte (1, 13), (1, 14), (1, 11) –

+0

@AbdulManaf ... Irgendwie fehlte das 'select' vor dem' from'. –

2

mit postgresql 9.5 (neueste Version)

Verwendung Abfrage wie diese

insert into someTable (col1,col2) values(1,13),(1,14),(1,11) ON CONFLICT DO NOTHING; 

es Vervielfältigung ohne zusätzliche Codezeile zu vermeiden.