Ricerca…


introduzione

MERGE (spesso chiamato anche UPSERT per "aggiornamento o inserimento") consente di inserire nuove righe o, se esiste già una riga, di aggiornare la riga esistente. Il punto è di eseguire l'intero set di operazioni atomicamente (per garantire che i dati rimangano coerenti) e per prevenire l'overhead di comunicazione per più istruzioni SQL in un sistema client / server.

MERGE per rendere Target match Source

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
    ;

Nota: la parte AND NOT EXISTS impedisce l'aggiornamento di record che non sono stati modificati. L'utilizzo del costrutto INTERSECT consente di confrontare le colonne nullable senza una gestione speciale.

MySQL: contando gli utenti per nome

Supponiamo di voler sapere quanti utenti hanno lo stesso nome. Cerchiamo di creare users tabelle come segue:

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

Ora, abbiamo appena scoperto un nuovo utente di nome Joe e vorrei tenerlo in considerazione. Per riuscirci, dobbiamo determinare se esiste una riga esistente con il suo nome e, in tal caso, aggiornarla per incrementare il conteggio; d'altra parte, se non esiste una riga esistente, dovremmo crearla.

MySQL utilizza la seguente sintassi: inserire ... sull'aggiornamento della chiave duplicato .... In questo caso:

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

PostgreSQL: conteggio degli utenti per nome

Supponiamo di voler sapere quanti utenti hanno lo stesso nome. Cerchiamo di creare users tabelle come segue:

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

Ora, abbiamo appena scoperto un nuovo utente di nome Joe e vorrei tenerlo in considerazione. Per riuscirci, dobbiamo determinare se esiste una riga esistente con il suo nome e, in tal caso, aggiornarla per incrementare il conteggio; d'altra parte, se non esiste una riga esistente, dovremmo crearla.

PostgreSQL usa la seguente sintassi: insert ... on conflict ... do update .... In questo caso:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow