sql >> Databáze >  >> RDS >> Mysql

Jak zabránit duplicitnímu vkládání do tabulky

Na e-mailové adrese nemáte jedinečný klíč . To je vaše nejlepší naděje, protože v systému může být mnoho John Doe. Takže jedinečný složený index na celé jméno není nikdy dobrý nápad.

Je možné vydat INSERT IGNORE, který se po duplicitním porušení vleče, jako by se nic nestalo (toto je vysoce nedoporučované a ve vašem případě není možné, protože neexistuje vaše jedinečné omezení e-mailu). Hlavním problémem při tom je, že máte tendenci (čti:pravděpodobně ztratíte) veškerou kontrolu nad tokem toho, co se děje, a zůstanou vám nežádoucí data. Takže jej nepoužívejte, pokud nejste profík.

Jeden může vydat a VLOŽIT AKTUALIZACI DUPLIKÁTNÍHO KLÍČE (také znám jako IODKU), který také vyžaduje jedinečný klíč (může být také jedinečný složený). Jako takový by nenastal nový řádek, ale aktualizace řádku. Jako příklad lze vložit nový řádek se 4 sloupci, ale při porušení duplikace lze provést aktualizaci pouze u dvou sloupců, například

za předpokladu, že pod PK v neviditelném sloupci id int a jedinečný klíč na emailAddr

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

Je to jedinečný klíč na emailAddr, díky kterému to funguje. Zbývá pouze 1 řádek na emailAddr, vždy.

Takže můžete mít neomezený počet Joe Smiths, ale pouze 1 řádek na e-mailovou adresu.

Vytvořená tabulka pro výše uvedenou tabulku by mohla vypadat takto

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

Po vytvoření tabulky můžete také zadat příkazy ALTER TABLE a přidat omezení. V závislosti na datech v nich může hovor selhat.

Mysql Vložit při aktualizaci duplicitního klíče a Změnit tabulku manuálové stránky.

Řeknu to znovu, bez správného nastavení schématu nebude IODKU fungovat a zůstanou vám nežádoucí řádky. Tak na to nebuďte líní. Nastavení schématu nejprve umožní to k úspěchu (s jedinečnými klíči), pak přejděte k používání IODKU.



  1. Polymorfismus v SQL databázových tabulkách?

  2. ORACLE (11.2.0.1.0) - Rekurzivní CTE s výrazem data

  3. Jak získat OBJECT_NAME() z jiné databáze na SQL Server

  4. Jak nastavit řádek MySQL na READ-ONLY?