sql >> Databasteknik >  >> RDS >> Mysql

Hur man förhindrar dubbla insatser i en tabell

Du har ingen unik nyckel på e-postadressen . Det är ditt bästa hopp, eftersom många John Doe's kan finnas i systemet. Så ett unikt sammansatt index över fullständigt namn är aldrig en bra idé.

Man kan utfärda en INSERT IGNORE som trampar på efter en duplicerad överträdelse som om ingenting händer (detta är högst orekommenderat, och i ditt fall inte möjligt eftersom din unika begränsning av e-post inte finns). Det stora problemet med att göra detta är att du tenderar (läs:förmodligen kommer) att förlora all kontroll över flödet av vad som händer och bli kvar med oönskad data. Så använd den inte, såvida du inte är ett proffs.

Man kan utfärda och INSERT PÅ DUBLIKAT UPPDATERING AV NYCKEL a> (a.k.a. IODKU) som också kräver en unik nyckel (kan också vara en unik komposit). Som sådan skulle en ny rad inte inträffa utan en uppdatering av raden. Som ett exempel kan en ny rad med 4 kolumner infogas, men vid dubblering kan en uppdatering utföras på bara två av kolumnerna, såsom

antar en PK nedanför en osynlig kolumn id int , och en unik nyckel på emailAddr

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

Det är den unika nyckeln på emailAddr som gör att detta fungerar. Kvar med bara en rad per emailAddr, någonsin.

Så du kan ha obegränsat antal Joe Smiths, men bara en rad per e-postadress.

Skapa tabellen för tabellen ovan kan se ut

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 också utfärda ALTER TABLE-kommandon för att lägga till begränsningar efter att tabellen har skapats. Beroende på uppgifterna däri kan samtalet misslyckas.

Mysql Infoga vid dubblettnyckeluppdatering , och Ändra tabell manualsidor.

Jag säger det igen, utan korrekt schemainställning kommer IODKU inte att fungera och du kommer att lämnas med oönskade rader. Så var inte lat för det. Konfigurera schemat först så att det lyckas (med unika nycklar), gå vidare mot att använda IODKU.



  1. "Självsignerat certifikat"-fel under förfrågan den Heroku-värdade Postgres-databasen från Node.js-applikationen

  2. JPA + StoredProcedureCall + objekttyp IN-parameter

  3. Är enstaka mysql-satser atomära i MyISAM och InnoDB?

  4. Sökordssökning med PHP MySql?