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

Sådan forhindres duplikatindsættelser i en tabel

Du har ikke en unik nøgle på e-mailadressen . Det er dit bedste håb, da mange John Doe'er kan være i systemet. Så et unikt sammensat indeks over fulde navn er aldrig en god idé.

Man kan udstede en INSERT IGNORE, som skrider frem efter en dublet overtrædelse, som om intet sker (dette er stærkt uanbefalet, og i dit tilfælde ikke muligt, fordi din unikke begrænsning på e-mail ikke er til stede). Det største problem ved at gøre dette er, at din tendens (læs:sandsynligvis vil) miste al kontrol over flowet af, hvad der sker, og blive efterladt med uønskede data. Så brug det ikke, medmindre du er en professionel.

Man kan udstede og INDSÆT PÅ DUPLIKAT NØGLEOPDATERING (a.k.a. IODKU), der også kræver en unik nøgle (kan også være en unik sammensætning). Som sådan ville en ny række ikke forekomme, men en opdatering af rækken. Som et eksempel kunne der indsættes en ny række med 4 kolonner, men ved overtrædelse af duplikering kunne en opdatering udføres på kun to af kolonnerne, såsom

antages i under en PK på en uset kolonne id int , og en unik nøgle på emailAddr

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

Det er den unikke nøgle på emailAddr, der får dette til at fungere. Tilbage med kun 1 række pr. emailAddr, nogensinde.

Så du kan have ubegrænset Joe Smiths, men kun 1 række pr. e-mailadresse.

Opret-tabellen for ovenstående tabel kunne se ud

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

Du kan også udstede ALTER TABLE-kommandoer for at tilføje begrænsninger, efter at tabellen er oprettet. Afhængigt af dataene heri kan opkaldet mislykkes.

Mysql Indsæt på dubletnøgleopdatering , og ændre tabel manualsider.

Jeg vil sige det igen, uden den korrekte skemaopsætning vil IODKU ikke fungere, og du vil stå tilbage med uønskede rækker. Så vær ikke doven med det. Konfigurer skema først giver det succes (med unikke nøgler), derefter gå videre mod at bruge IODKU.



  1. mysql i xampp starter og stopper om fem sekunder

  2. Udfør kun mysql insert, hvis tabellen er tom

  3. Skinner:Fejl ved installation af pg gem

  4. Hvordan kan jeg få en hash af en hel tabel i postgresql?