Resumo : neste tutorial, você aprenderá como usar INSERT ON DUPLICATE KEY UPDATE
a instrução MySQL para inserir dados em uma tabela ou atualizar dados se ocorrer um erro de violação de chave duplicada.
Observe que este tutorial é relevante para MySQL 8.0.19 ou posterior.
Introdução à instrução MySQL INSERT ON DUPLICATE KEY UPDATE
No MySQL, a INSERT ON DUPLICATE KEY UPDATE
instrução permite inserir novas linhas em uma tabela .
Se ocorrer uma violação de chave duplicada, você poderá usar a INSERT ON DUPLICATE KEY UPDATE
instrução para atualizar as linhas existentes em vez de gerar um erro.
Esta INSERT ON DUPLICATE KEY UPDATE
instrução é útil quando você lida com restrições exclusivas ou chaves primárias .
Aqui está a sintaxe da INSERT ON DUPLICATE KEY UPDATE
instrução:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE
column1 = new_value1,
column2 = new_value2,
...;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
INSERT INTO table_name
: Especifique o nome da tabela após asINSERT INTO
palavras-chave.(column1, column2, ...)
: Liste as colunas da tabela onde você deseja inserir os dadosVALUES(...)
: Forneça valores a serem inseridos nas colunas correspondentesON DUPLICATE KEY UPDATE
: especifique a ação a ser tomada se ocorrer uma violação de chave duplicada.column1 = new_value1, column2=new_value2
: defina como as linhas existentes devem ser atualizadas se uma chave duplicada for encontrada.
A instrução retorna o número de linhas afetadas com base na ação que executa:
- 1 é retornado quando uma nova linha é inserida.
- 2 é retornado quando uma linha existente é atualizada.
- 0 é retornado quando nenhuma alteração é feita em uma linha existente.
Aliases de linha
O MySQL permite que você defina um alias de linha para a linha inserida usando a cláusula AS alias_name
after VALUES
.
Então, você pode usar o alias dentro da ON DUPLICATE KEY UPDATE
cláusula para fazer referência aos valores da linha inserida.
Esta é a sintaxe para definir um alias de linha:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
AS new_data -- Row alias
ON DUPLICATE KEY UPDATE
column1 = new_data.column1,
column2 = new_data.column2 + 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Aliases de coluna
O MySQL também permite atribuir aliases às colunas para evitar ambiguidade, especialmente com nomes de colunas longos:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (...)
AS new(alias1, alias2, alias3, ...)
ON DUPLICATE KEY UPDATE
column1 = alias2 + alias3;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Exemplos de MySQL INSERT ON DUPLICATE KEY UPDATE
Vejamos alguns exemplos de uso do INSERT ON DUPLICATE KEY UPDATE
para entender como ele funciona.
Criaremos uma employees
tabela para demonstração:
CREATE TABLE employees(
id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT NOT NULL,
salary DECIMAL(10,2) NOT NULL,
bonus DECIMAL(10,2) DEFAULT 0
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
1) Exemplo de uso de alias de linha
Primeiro, insira uma nova linha na employees
tabela:
INSERT INTO employees(id, name, age, salary)
VALUES(1, 'Jane Doe', 25, 120000);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, recupere os dados da employees
tabela:
SELECT * FROM employees;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+----+----------+-----+-----------+-------+
| id | name | age | salary | bonus |
+----+----------+-----+-----------+-------+
| 1 | Jane Doe | 25 | 120000.00 | 0.00 |
+----+----------+-----+-----------+-------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Terceiro, insira uma nova linha na employees
tabela ou atualize a linha existente se ocorrer uma violação de chave duplicada:
INSERT INTO employees(id, name, age, salary)
VALUES (1, 'Jane Smith', 26, 130000)
AS new
ON DUPLICATE KEY UPDATE
name = new.name,
age = new.age,
salary = new.salary;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
Query OK, 2 rows affected (0.00 sec)
Linguagem de código: CSS ( css )
Neste exemplo, usamos new
como alias de linha. Como a linha com id 1 já existe, a instrução atualiza a linha em vez de inserir uma nova.
Na ON DUPLICATE KEY UPDATE
cláusula, acessamos o novo valor especificado na VALUES
cláusula por meio do alias da linha e usamos esses novos valores para atualizar as colunas name
, age
e .salary
Por fim, recupere os dados da employees
tabela:
SELECT * FROM employees;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+----+------------+-----+-----------+-------+
| id | name | age | salary | bonus |
+----+------------+-----+-----------+-------+
| 1 | Jane Smith | 26 | 130000.00 | 0.00 |
+----+------------+-----+-----------+-------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
2) Usando a instrução MySQL INSERT ON DUPLICATE KEY UPDATE para atualizar outro exemplo de coluna
Primeiro, insira uma nova linha ou atualize a nova coluna de salário e bônus, se a linha existir:
INSERT INTO employees(id, name, age, salary)
VALUES(1, 'Jane Doe', 26, 140000)
AS new
ON DUPLICATE KEY UPDATE
salary = new.salary,
bonus = new.salary * 0.1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
Query OK, 2 rows affected (0.01 sec)
Linguagem de código: CSS ( css )
Segundo, recupere os dados da employees
tabela:
SELECT * FROM employees;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Saída:
+----+------------+-----+-----------+----------+
| id | name | age | salary | bonus |
+----+------------+-----+-----------+----------+
| 1 | Jane Smith | 26 | 140000.00 | 14000.00 |
+----+------------+-----+-----------+----------+
1 row in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Resumo
- Use a
ON DUPLICATE KEY UPDATE
opção daINSERT
instrução para inserir dados em uma tabela e atualizar os dados existentes se ocorrer um erro duplicado.