Inserir uma fila se não existir no MySQL
-
Utilize
REPLACE
para inserir se não existir no MySQL -
Utilize
INSERT IGNORE
para inserir se não existir no MySQL -
Utilize
INSERT ... ON DUPLICATE KEY UPDATE
para inserir 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
.
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