Lidt mere INSERT

December 2, 2008 · Posted in Udvikling · Comment 

INSERT har en lille ekstra feature som de færeste kender til. De fleste kender INSERT IGNORE eller REPLACE INTO som man kan bruge hvis man indsætter noget der overlapper en unik eller primær nøgle. Men der findes også en ON DUPLICATE KEY det gør det muligt at lave lidt mere avancerere ting. Jeg demonstrerer med et lille eksempel.

Jeg har en tabel til tags:

1
2
3
4
5
CREATE TABLE tags (
  tag VARCHAR(255),
  cnt INT UNSIGNED DEFAULT '1',
  PRIMARY KEY (tag)
) ENGINE = MYISAM;

Bemærk at cnt som standard er 1 og at tag er min primære nøgle. Jeg vil i tag gemme tag-navnet og i cnt gemme antallet af tags. Jeg indsætter data på følgende måde:

1
2
3
4
5
6
7
8
INSERT INTO tags (tag) VALUES ('foo')
   ON DUPLICATE KEY UPDATE cnt=cnt+1;
 
INSERT INTO tags (tag) VALUES ('foo')
   ON DUPLICATE KEY UPDATE cnt=cnt+1;
 
INSERT INTO tags (tag) VALUES ('foo')
   ON DUPLICATE KEY UPDATE cnt=cnt+1;

Feltet cnt indeholder nu 3, og der findes kun én række med “foo”.

Første gang findes foo ikke i forvejen, og cnt bliver derfor 1. Anden gang er foo der og cnt bliver talt op. Samme gør sig gældende de efterfølgende gange.

Det er måske et lidt tænkt eksempel, men det illustrerer rimelig godt hvordan ON DUPLICATE KEY virker.


  • Om websmed.dk

    Jeg hedder Morten, og jeg har udviklet webapplikationer siden slutningen af 90'erne.

    Jeg vil her dele ud af min erfaring, og med jævne mellemrum poste nogle tips og tricks, samt løsningsforslag på generelle dagligdags problemstillinger.

    Jeg har en forkærlighed for PHP og MySQL, hvorfor I nok vil se flest indlæg der vedrører den gren af webudvikling.

    Jeg har en anden blog af mere personlig karakter på mbn.dk, hvor I kan finde kontaktmuligheder m.m.

    Mine indlæg vil tit være baseret på problemstillinger i mit daglige virke, eller i mit eget firma MRLYTICS, hvor jeg sælger kundeundersøgelser samt kundedatabaser.

    Denne side er hostet hos slicehost.

  • Skrevet på Twitter