Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Implementação do SQL Server 2005 do MySQL REPLACE INTO?


Isso é algo que me incomoda no MSSQL (desabafo em meu blog ). Desejo suporte para MSSQL upsert .

O código do @Dillie-O é uma boa maneira em versões SQL mais antigas (+1 voto), mas ainda é basicamente duas operações de E/S (o exists e, em seguida, a update ou insert )

Há uma maneira um pouco melhor esta postagem , basicamente:
--try an update
update tablename 
set field1 = 'new value',
    field2 = 'different value',
    ...
where idfield = 7

--insert if failed
if @@rowcount = 0 and @@error = 0
    insert into tablename 
           ( idfield, field1, field2, ... )
    values ( 7, 'value one', 'another value', ... )

Isso reduz para uma operação de E/S se for uma atualização ou duas se for uma inserção.

MS Sql2008 apresenta merge do padrão SQL:2003:
merge tablename as target
using (values ('new value', 'different value'))
    as source (field1, field2)
    on target.idfield = 7
when matched then
    update
    set field1 = source.field1,
        field2 = source.field2,
        ...
when not matched then
    insert ( idfield, field1, field2, ... )
    values ( 7,  source.field1, source.field2, ... )

Agora é realmente apenas uma operação de IO, mas um código horrível :-(