Inserir uma fila se não existir no MySQL

Rayven Esplanada 30 janeiro 2023
  1. Utilize REPLACE para inserir se não existir no MySQL
  2. Utilize INSERT IGNORE para inserir se não existir no MySQL
  3. Utilize INSERT ... ON DUPLICATE KEY UPDATE para inserir se não existir no MySQL
Inserir uma fila se não existir no MySQL

Este tutorial mostra-lhe como inserir uma linha numa tabela se ainda não existir no mySQL.

Há três formas simples de resolver este problema, utilizando REPLACE, INSERT IGNORE, ou INSERT ... ON DUPLICATE KEY UPDATE.

Em primeiro lugar, imaginemos que temos uma tabela person estruturada como tal:

CREATE TABLE person (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
address VARCHAR(128) 
);

Com os seguintes registos existentes:

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard

Agora vamos entrar nas soluções reais.

Utilize REPLACE para inserir se não existir no MySQL

O que o REPLACE faz é sobrescrever os registos existentes quando encontrado; se ainda não existir, irá inserir uma nova linha. É essencialmente como UPDATE mas com capacidades de INSERT.

Vamos fornecer uma consulta de amostra para executar REPLACE em John Doe.

REPLACE INTO 'person'
SET id = 1,
name = 'John Doe'`,
age = 28,
address = 'Los Angeles, California'

Se John Doe existir, ele será substituído pelos novos dados; se não existir, criará uma nova entrada para John Doe.

Contudo, este método não é eficiente para a inserção, uma vez que substitui os registos existentes em vez de simplesmente ignorá-los, caso sejam encontrados. Embora faça o trabalho, não é a melhor maneira de o fazer.

O novo resultado ao seleccionar John Doe será como tal:

id name age address
1 John Doe 28 Los Angeles, California

A idade e o endereço de John Doe foram modificados ou actualizados pelo guião REPLACE.

Utilize INSERT IGNORE para inserir se não existir no MySQL

Utilizaremos os mesmos dados não editados na tabela acima também para isto.

Em INSERT IGNORE, se a chave primária do registo já estiver presente na base de dados, ele será silenciosamente ignorado ou ignorado.

Se retirarmos a palavra-chave INSERT IGNORE, a inserção de um registo com uma id ou chave primária existente abortará a consulta e mostrará uma mensagem de erro dizendo que o registo com a chave primária já existe.

Após o INSERT, o IGNORE é um substituto para o aborto devido ao erro, e em vez disso apenas continua a consulta embora não insira um novo registo.

INSERT IGNORE person
SET 'id' = 4,
age = 1000,
address = 'Chicago'

Com base na tabela que declarámos acima, já existe um registo com um id ou a chave primária 4 (Thor Odinson). Por conseguinte, esta consulta é ignorada pelo guião e, portanto, não actualizando ou inserindo um registo na base de dados.

O resultado, se consultarmos Thor em person, será:

id name age address
4 Thor Odinson 40 Asgard

A idade e o endereço na consulta não afectaram em nada a fila com o id 4.

Utilize INSERT ... ON DUPLICATE KEY UPDATE para inserir se não existir no MySQL

Se utilizar a cláusula ON DUPLICATE KEY UPDATE e a linha que pretende inserir for uma duplicação num índice UNIQUE ou chave primária, a linha executará um UPDATE.

Isto faz essencialmente a mesma coisa que o REPLACE faz.

Digamos que queremos inserir um registo com o id 2

INSERT INTO person (id, name, age, address)
VALUES (1, 'Jane Deer', '33', 'Tallahassee Florida')
ON DUPLICATE KEY UPDATE id = id+1;

O id é incrementado para gerar um novo registo em vez de actualizar o existente.

Se consultarmos todas as filas de “pessoa”, o resultado será este:

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard
5 Jane Deer 33 Tallahasee, Florida

O Jane Deer', em vez de substituir o Jane doe’, é acrescentado como um novo registo na tabela.

A forma mais eficiente de lidar com a inserção e verificação da sua existência é definitivamente através da utilização de INSERT IGNORE.

Contudo, as duas outras palavras-chave são também utilizáveis caso a caso, se alguma vez quiser actualizar se existir uma linha que queira inserir, utilize REPLACE. Se não quiser que a linha seja modificada mas quiser realmente inserir o novo registo, utilize INSERT ... ON DUPLICATE KEY UPDATE.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn