SQL Insert / Update Prático 2021 Scriptcase

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();

SQL:2016 - Wikipedia

5 Curtidas

Não cliquem no Link do
ShelleyDHolbert é um Trojan, moderação favor excluir o Post.

Sinalizei para moderação é bom fazer o mesmo Jailton

1 Curtida

Eu sempre usai o REPLACE INTO tabela campos values (valores)

1 Curtida

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.

Inseri sim.

Exato, se existir a primary key, ou uma unique key, ele exclui e reinsere.

Nunca comparei ambos para analisar a performance. Mas um Insert sempre é mais rápido que um update apesar de se ter o delete.

1 Curtida

Sim por isso que uso Insert. :nerd_face::beers:

Por ser mais rápido Jailton?

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.

Vou fazer os tests e comparar …

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:

  1. Executa a instrução 16% mais rápido o INSERT INTO SET ON DUPLICATE KEY UPDATE:
  2. Sua instrução é mais simples de se escrever
  3. Utiliza bem menos recursos de Máquina do que o INSERT INTO SET ON DUPLICATE KEY UPDATE:

Desvantagens:

  1. Necessita Lock na Tabela
  2. 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:

  1. Não precisa desligar o AutoIncrement em Chaves Primarias.
  2. Não precisa estar em Lock, apesar de desaconselhável por razões abaixo explicadas.

Desvantagens:

  1. 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
  2. Mais lento que o REPLACE
  3. 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:

1 Curtida

Obrigado :slight_smile:

Obrigado por responder, eu também estava procurando por isso.