2013-05-19 14 views
15

Ho un database che viene aggiornato con i set di dati di volta in volta. Qui può accadere che venga consegnato un set di dati che esiste già nel database.Do INSERT condizionale con SQL?

Attualmente sto facendo un primo

SELECT FROM ... WHERE val1=... AND val2=... 

per controllare, se un insieme di dati con questi dati esiste già (utilizzando i dati in DOVE-economico). Se questo non restituisce alcun valore, sto facendo il mio INSERT.

Ma questo sembra essere un po 'complicato per me. Quindi la mia domanda: c'è qualche tipo di INSERT condizionale che aggiunge un nuovo set di dati solo nel caso in cui non esista?

sto usando SmallSQL

+6

*** CHE COSA *** il sistema di database è questo? SQL è solo il linguaggio di query, utilizzato da molti prodotti di database. SQL è ** non ** un prodotto di database in sé. Quindi per favore fateci sapere se state usando MySQL, Postgres, Oracle, IBM DB2, SQL Server, Firebird - o qualsiasi altra cosa possa essere ... –

+1

Stai parlando di [Unisci/Upsert] (http: // en. wikipedia.org/wiki/Merge_(SQL))? –

+0

@Elmi: alcune delle risposte riportate di seguito hanno risolto il problema? – DougM

risposta

17

Potete farlo con una singola istruzione e una sottoquery in quasi tutti i database relazionali.

INSERT INTO targetTable(field1) 
SELECT field1 
FROM myTable 
WHERE NOT(field1 IN (SELECT field1 FROM targetTable)) 

Alcuni database relazionali hanno migliorato la sintassi per quanto sopra, dal momento che ciò che si descrive è un compito abbastanza comune. SQL Server ha una sintassi MERGE con tutti i tipi di opzioni e MySQL ha una sintassi opzionale INSERT OR IGNORE.

Modifica:SmallSQL's documentation è piuttosto scarso rispetto a quali parti dello standard SQL implementa. Potrebbe non implementare le sottoquery e, come tale, potresti non essere in grado di seguire il consiglio di cui sopra, o da qualsiasi altra parte, se hai bisogno di attenersi a SmallSQL.

+0

Se stai usando un 'INSERT ... VALUES ('a,' 'b,' 'c')', cambia la tua istruzione in 'INSERT ... SELECT 'a', 'b', 'c' WHERE ... 'senza parentesi. – Noumenon

10

Non so circa SmallSQL, ma questo funziona per MSSQL:

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue') 
    UPDATE Table1 SET (...) WHERE Column1='SomeValue' 
ELSE 
    INSERT INTO Table1 VALUES (...) 

Basato sulla cui condizione, questo aggiorna la riga se esiste, altrimenti ne inserirà uno nuovo.

Spero che sia quello che stavi cercando.

+4

Non credo che 'IF' fa parte dello standard SQL – Andomar

+0

OK grazie. Cambiato in "MSSQL" –

+0

Questa è la prima volta che sono contento che il mio attuale datore di lavoro utilizzi i database MSSQL. – Cheeku

0

Se stai cercando di fare un "upsert" uno dei modi più efficaci attualmente in SQL Server per le singole righe è questo:

UPDATE myTable ... 


IF @@ROWCOUNT=0 
    INSERT INTO myTable .... 

È inoltre possibile utilizzare la sintassi MERGE se si esegue questa operazione con insiemi di dati anziché singole righe.

Se si vuole INSERT e non UPDATE allora si può solo scrivere il singolo INSERT dichiarazione e utilizzare WHERE NOT EXISTS (SELECT ...)

1

E 'possibile con lo stato EXISTS. WHERE EXISTS test per l'esistenza di qualsiasi record in una sottoquery. EXISTS restituisce true se la sottoquery restituisce uno o più record. Ecco un esempio

UPDATE TABLE_NAME 
SET val1=arg1 , val2=arg2 
WHERE NOT EXISTS 
    (SELECT FROM TABLE_NAME WHERE val1=arg1 AND val2=arg2)