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;