Zoeken…


Invoering

MERGE (vaak ook UPSERT genoemd voor "bijwerken of invoegen") maakt het mogelijk om nieuwe rijen in te voegen of, als er al een rij bestaat, de bestaande rij bij te werken. Het gaat erom de hele reeks bewerkingen atomisch uit te voeren (om te garanderen dat de gegevens consistent blijven) en om communicatieoverhead voor meerdere SQL-instructies in een client / serversysteem te voorkomen.

MERGE om Target match Source te maken

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
    ;

Opmerking: het gedeelte AND NOT EXISTS voorkomt dat records worden bijgewerkt die niet zijn gewijzigd. Met behulp van het INTERSECT construct kunnen nulstelbare kolommen worden vergeleken zonder speciale afhandeling.

MySQL: gebruikers op naam tellen

Stel dat we willen weten hoeveel gebruikers dezelfde naam hebben. Laten we als volgt tafelgebruikers users :

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

Nu hebben we net een nieuwe gebruiker ontdekt met de naam Joe en we willen hier graag rekening mee houden. Om dat te bereiken, moeten we bepalen of er een bestaande rij met zijn naam is, en zo ja, deze bijwerken naar oplopend tellen; aan de andere kant, als er geen bestaande rij is, moeten we deze maken.

MySQL gebruikt de volgende syntaxis: invoegen ... bij dubbele sleutelupdate .... In dit geval:

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

PostgreSQL: gebruikers op naam tellen

Stel dat we willen weten hoeveel gebruikers dezelfde naam hebben. Laten we als volgt tafelgebruikers users :

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

Nu hebben we net een nieuwe gebruiker ontdekt met de naam Joe en we willen hier graag rekening mee houden. Om dat te bereiken, moeten we bepalen of er een bestaande rij met zijn naam is, en zo ja, deze bijwerken naar oplopend tellen; aan de andere kant, als er geen bestaande rij is, moeten we deze maken.

PostgreSQL gebruikt de volgende syntaxis: invoegen ... bij conflict ... bijwerken .... In dit geval:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow