Inserire un record nella tabella MySql solo se non esiste già

Vorrei inserire un record in una tabella MySql solo se questo non è già presente all'interno dell'archivo, è possibile farlo con una query sql diretta o devo prima verificarlo con una select e poi eventualmente fare la insert?

Questa seconda possibilità mi sembra alquanto macchinosa e dispendiosa in termini di performance, potreste aiutarmi?

In Corso 5
MySql 10-12-2018 2 Risposte 4965 Visite 0

Risposte ( 2 approvate )

  1. Giorgio Borelli
    +1
    10-12-2018 17:38:14
    Rispondi

    Per inserire un record o un valore 'primario' solo nel caso in esso non esista già nella tabella hai due strade:

    • Usare l'istruzione sql INSERT IGNORE ...
    • Usare l'istruzione sql INSERT ... ON DUPLICATE KEY UPDATE ...

    Quindi, facendo leva su una chiave primaria (PRIMARY KEY) o su un INDICE UNICO (UNIQUE INDEX) il motore di MySql verifica che per questi tipi di colonna il valore non sia già presente in archivio, nel caso di INSERT IGNORE non farà nulla (quindi nessuna riga viene coinvolta) nel caso della On DUPLICATE KEY essendo un'azione a posteriore dell'errore (violazione del vincolo di unicità sulla chiave primaria ad esempio) la riga sarà comunque 'affetta' dall'istruzione.

  2. Giacomo Barrile
    0
    10-12-2018 17:51:50
    Rispondi

    Agganciandomi a quasto scritto da Giorgio, la sintassi sql per la INSERT IGNORE è:

    INSERT IGNORE INTO MyTable (my_column_PK,my_column_1,my_column_2) VALUES (1,'abc','def');

    se il record con valore della chiave primaria = 1 già esiste questa query sarà ignorata (0 rows affected) e non sarà restituito alcun errore da parte di MySql ma solo un warning.

    Mentre per la ON DUPLICATE KEY avrai:

    INSERT INTO MyTable (my_column_PK,my_column_1,my_column_2) VALUES (1,'abc','def') ON DUPLICATE KEY UPDATE my_column_PK=my_column_PK;

    Che non solo ti consente di aggiornare eventuali valore (colonne del record) nel caso questo esista già, ma MySql tiene traccia che la riga è stata modificata (1 row affected).

Rispondi

Per poter rispondere a questa domanda, devi essere registrato e loggato sul sito, dopodichè compila il box sottostante cercando di essere il più chiaro ed esauriente possibile, la tua risposta potrebbe essere la soluzione che l'utente cerca ed essere contrassegnata come migliore, consentendoti così di ottenere punti ed autorevolezza.

Guglielmo Adolpi

Guglielmo Adolpi

Autore di questa domanda

 Domanda Precedente

 Elenco Domande 

Domanda Successiva