Com a última revisão da Linguagem SQL de 2016, agora conseguimos fazer um insert e update
na mesma query de forma prática, testei no MariaDB / MySQL
Insert Quando a Chave Primária ClienteID é Auto-Incremento e temos
certeza que não vai existir outra igual na Inclusão:
/*
Insert Quando a Chave Primária ClienteID é Auto-Incremento e temos
certeza que não vai existir outra igual na Inclusão.
*/
$_Tabela = 'clientes';
$_Campos = "
Nome = 'A',
Idade = 19
";
$sql ="
INSERT
INTO $_Tabela SET
$_Campos
";
sc_exec_sql($sql);
sc_commit_trans();
Insert quando já temos o Valor da Chave Primária ClienteID, ai caso
já existir o Registro da Chave Primária ele atualiza os campos, com
isso não precisamos usar um sc_lookup() antes para checar se já existe
o registro e caso o registro não existir ele já inclui o mesmo:
/*
Insert quando já temos o Valor da Chave Primária ClienteID, ai caso
já existir o Registro da Chave Primária ele atualiza os campos, com
isso não precisamos usar um sc_lookup() antes para checar se já existe
o registro e caso o registro não existir ele já inclui o mesmo.
*/
$_Tabela = 'clientes';
$_ChavePrimaria = "ClienteID = 1";
$_Campos_Insert = "
$_ChavePrimaria,
Nome = 'MARIA SILVA',
Idade = 19
";
$_Campos_Update = "
$_ChavePrimaria,
Idade = 22
";
$sql ="
INSERT
INTO $_Tabela SET
$_Campos_Insert
ON DUPLICATE KEY UPDATE
$_Campos_Update
";
sc_exec_sql($sql);
sc_commit_trans();
O Replace into o tem o padrão: Se o registro existir atualiza, se não insere?
Também achei isto:
REPLACE funciona exatamente como INSERT, exceto que se uma linha antiga na tabela tem o mesmo valor que uma nova linha para uma PRIMARY KEY ou um índice UNIQUE, a linha antiga é excluída antes que a nova linha seja inserida.
Eu usei o ON DUPLICATE KEY UPDATE, recentemente, e importação de arquvos com gigabytes, estou propenso a mudar para Replace, pois o uso dos recursos de máquina foram nas alturas… Sempre é bom trabalhar com opções que usem menos recursos de máquina.
Benchmarking entre REPLACE INTO e INSERT INTO SET ON DUPLICATE KEY UPDATE:
Servidor IBM XEON Linux Debian.
Banco de dados Maria DB.
Tabela MyIsam.
Nota: A tabela testada já estava com todos os dados inseridos, então ambos as instruções realizaram uma alteração de dados e não uma inserção.
REPLACE INTO:
Processou um arquivo CSV de 206.217.416 bytes com 2.019.150 linhas em 13 minutos e 6 segundos.
INSERT INTO SET ON DUPLICATE KEY UPDATE:
Processou mesmo arquivo CSV de 206.217.416 bytes com 2.019.150 linhas em 15 minutos e 12 segundos.
Porque o REPLACE é mais rápido? Porque não faz um read dos dados, contrário do INSERT INTO SET ON DUPLICATE KEY UPDATE, que internamente precisa localizar os dados para prover a alteração. Bancos de Dados muito fragmentados diminuem mais ainda a performance dessa instrução, pois o registros pode estar fisicamente distribuido em diferentes blocagens físicas do disco. Quanto ao REPLACE, ele exclui o índice (só índice, os dados ficam marcados com blocagem livre, pois um delete não apaga fisicamente os dados do registro) e o re-insere, ato que faz com que o banco pegue a próxima memória com blocagem livre, e escreve todo o registro de dados nessa blocagem e/ou, conforme o tamanho do registro, nas próximas blocagens livres.
REPLACE INTO: Vatagens:
Executa a instrução 16% mais rápido o INSERT INTO SET ON DUPLICATE KEY UPDATE:
Sua instrução é mais simples de se escrever
Utiliza bem menos recursos de Máquina do que o INSERT INTO SET ON DUPLICATE KEY UPDATE:
Desvantagens:
Necessita Lock na Tabela
Para Tabelas com Chaves Primarias e AutoIncrement necessita-se desligar o AutoIncrement antes do processo e ligar novamente em seguida (com a tabela travada ainda).
INSERT INTO SET ON DUPLICATE KEY UPDATE: Vantagens:
Não precisa desligar o AutoIncrement em Chaves Primarias.
Não precisa estar em Lock, apesar de desaconselhável por razões abaixo explicadas.
Desvantagens:
Instrução mais complexa, pois necessita dar valores aos campos para o insert e para o update, requer mais preparação nos valores a serem alterados
Mais lento que o REPLACE
Utiliza 3 x mais recursos da Máquina (Processamento e Memória) que o REPLACE
Quando usar REPLACE?
Indiscutivelmente usar REPLACE para popular tabelas em massa alta de dados.
Tipo: Importação de arquivos texto, csv.
Quando usar INSERT INTO SET ON DUPLICATE KEY UPDATE?
Quando da atualização de dados em um tabela em produção, mas para poucos dados.
Quando pontualmente se deseja realizar um insert sem saber se o registro já está incluso. (Um INSERT padrão retorna erro, o que também não teria problema usar nesse caso, bastando controlar o erro de retorno).
Apesar de exemplo citado na mensagem original ser anacrônico (se você tem o id você sabe que o registro existe), para exemplificar o uso do INSERT INTO SET ON DUPLICATE KEY UPDATE, se faz interessante a dica ofertada para ampliar os leques de situações que pontualmente a instrução atenda bem a uma necessidade específica e por gerar uma discussão sadia ampliando os horizontes da programação.
Grato pelo tópico @Jailton.
Para finalizar, um artigo a respeito que achei interessante: