Sök…


Introduktion

MERGE (ofta även kallad UPSERT för "uppdatering eller infoga") gör det möjligt att infoga nya rader eller, om en rad redan finns, för att uppdatera den befintliga raden. Poängen är att utföra hela uppsättningen atomiskt (för att garantera att informationen förblir konsekvent) och att förhindra kommunikationsomkostnader för flera SQL-uttalanden i ett klient / serversystem.

FÖLJ för att göra Mål matchningskälla

MERGE INTO targetTable t
    USING sourceTable s
        ON t.PKID = s.PKID
    WHEN MATCHED AND NOT EXISTS (
            SELECT s.ColumnA, s.ColumnB, s.ColumnC
            INTERSECT
            SELECT t.ColumnA, t.ColumnB, s.ColumnC
            )
        THEN UPDATE SET
            t.ColumnA = s.ColumnA
            ,t.ColumnB = s.ColumnB
            ,t.ColumnC = s.ColumnC
    WHEN NOT MATCHED BY TARGET
        THEN INSERT (PKID, ColumnA, ColumnB, ColumnC)
        VALUES (s.PKID, s.ColumnA, s.ColumnB, s.ColumnC)
    WHEN NOT MATCHED BY SOURCE
        THEN DELETE
    ;

Obs: Delen AND NOT EXISTS förhindrar uppdatering av poster som inte har ändrats. Användning av INTERSECT konstruktionen gör det möjligt att INTERSECT nollbara kolumner utan speciell hantering.

MySQL: räknar användare efter namn

Anta att vi vill veta hur många användare som har samma namn. Låt oss skapa users enligt följande:

create table users(
    id int primary key auto_increment,
    name varchar(8),
    count int,
    unique key name(name)
);

Nu har vi precis upptäckt en ny användare med namnet Joe och vill ta hänsyn till honom. För att uppnå detta måste vi avgöra om det finns en befintlig rad med hans namn, och i så fall uppdatera den till inkrementräkning; å andra sidan, om det inte finns någon befintlig rad, bör vi skapa den.

MySQL använder följande syntax: infoga ... i duplikatnyckeluppdatering .... I detta fall:

insert into users(name, count)
       values ('Joe', 1)
       on duplicate key update count=count+1;

PostgreSQL: räknar användare efter namn

Anta att vi vill veta hur många användare som har samma namn. Låt oss skapa users enligt följande:

create table users(
    id serial,
    name varchar(8) unique,
    count int
);

Nu har vi precis upptäckt en ny användare med namnet Joe och vill ta hänsyn till honom. För att uppnå detta måste vi avgöra om det finns en befintlig rad med hans namn, och i så fall uppdatera den till inkrementräkning; å andra sidan, om det inte finns någon befintlig rad, bör vi skapa den.

PostgreSQL använder följande syntax: infoga ... på konflikt ... uppdatera ... I detta fall:

insert into users(name, count)
    values('Joe', 1)
    on conflict (name) do update set count = users.count + 1;


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow