Mysql
 sql >> Database >  >> RDS >> Mysql

Come prevenire inserimenti duplicati in una tabella

Non hai una chiave univoca sull'indirizzo email . Questa è la tua migliore speranza, come molti John Doe possono essere nel sistema. Quindi un indice composto univoco sul nome completo non è mai una buona idea.

Si può emettere un INSERT IGNORE che avanza dopo una violazione duplicata come se non accadesse nulla (questo è altamente sconsigliato e nel tuo caso non è possibile perché il tuo vincolo unico sull'e-mail non è presente). Il problema principale nel fare ciò è che la tua tendenza (leggi:probabilmente perderà tutto il controllo del flusso di ciò che sta accadendo e rimarrà con dati indesiderati. Quindi non usarlo, a meno che tu non sia un professionista.

Si può emettere e INSERT ON DUPLICATE KEY UPDATE (aka IODKU) che richiede anche una chiave univoca (può essere anche un composto univoco). In quanto tale, non si verificherebbe una nuova riga ma un aggiornamento della riga. Ad esempio, potrebbe essere inserita una nuova riga con 4 colonne, ma in caso di violazione di duplicazione, potrebbe essere eseguito un aggiornamento solo su due delle colonne, ad esempio

assumendo sotto un PK su una colonna invisibile id int e una chiave univoca su emailAddr

insert person(firstName,lastName,emailAddr) values 'Joe','Smith','[email protected]' 
on duplicate key update firstName='Joe',lastName='Smith'

È la chiave univoca su emailAddr che fa funzionare questo. Rimasto con solo 1 riga per emailAddr, mai.

Quindi, puoi avere Joe Smith illimitati, ma solo 1 riga per indirizzo email.

La tabella di creazione per la tabella sopra potrebbe assomigliare a

create table person
(  id int auto_increment primary key,
   firstName varchar(50) not null,
   lastName varchar(50) not null,
   emailAddr varchar(150) not null,
   unique key(emailAddr)  -- without this, IODKU will not work
);

È inoltre possibile emettere comandi ALTER TABLE per aggiungere vincoli dopo la creazione della tabella. A seconda dei dati in esso contenuti, la chiamata potrebbe non riuscire.

Mysql Inserisci su aggiornamento chiave duplicata e Alter Table pagine di manuale.

Lo dirò di nuovo, senza la corretta configurazione dello schema, IODKU non funzionerà e rimarrai con righe indesiderate. Quindi non essere pigro al riguardo. Imposta lo schema prima permettendogli di avere successo (con chiavi univoche), quindi passare all'utilizzo di IODKU.