2016-02-01 24 views
5

iam creare una tabella utilizzando il comando seguente in postgresql.inserire valori univoci per postgresql

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

quindi eseguo 2 istruzioni di inserimento.

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

    suo lavoro

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

    ottenuto l'errore (tasto (col1, col2) = (1,11) è già presente.

Ma ho bisogno di evitare solo coppie duplicate. Come sarà possibile?

iam provare questo con

PostgreSQL 9.5.0 su x86_64-pc-linux-gnu, compilato da gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, a 64 bit e PostgreSQL 9.3 su x86_64-pc -linux-gnu, compilato da gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, a 64 bit

ma ho ottenuto l'errore

ho bisogno ot mettere in questo modo, dopo l'esecuzione di due affermazioni.

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

Il secondo inserimento tenta di inserire i valori '(1,11)' che sono già stati inseriti con la prima istruzione. E come hai definito 'col1, col2' per essere unico, non puoi inserire la stessa tupla due volte. –

+0

è possibile inserire tutti gli altri valori (evitare coppie duplicate).? –

+0

Non con Postgres 9.1, è possibile farlo con Postgres 9.5 –

risposta

3

È possibile farlo utilizzando insert . . . select:

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

Cioè, filtrare i valori prima della insert.

EDIT:

Come un cavallo-con-senza-nome indica, è possibile anche scrivere questo come:

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

Io tendo ad usare l'approccio union all perché non tutti i database supportano questo uso della dichiarazione values().

+1

Non c'è bisogno del prolisso 'select' nella tabella derivata. È possibile utilizzare 'values ​​(1,13), (1,14)' direttamente lì –

+0

ho ricevuto errore da sopra sintassi ERRORE: errore di sintassi ao vicino a "da" LINEA 2: da (valori (1, 13), (1, 14), (1, 11) –

+0

@AbdulManaf ... In qualche modo, il 'select' mancava prima del' from'. –

2

utilizzando PostgreSQL 9.5 (ultima versione)

interrogazione uso come questo

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

eviterà la duplicazione senza alcuna riga in più di codice.