Declaração MySQL REPLACE – Inserir ou atualizar linhas em uma tabela
Declaração MySQL REPLACE
A declaração MySQL REPLACE permite inserir um novo registro em uma tabela do MySQL, caso o registro ainda não exista, ou atualizar um registro já existente. Funciona como se fosse uma declaração INSERT, mas sem apresentar erros se tentamos inserir um registro já inserido na tabela – em vez disso, valores das colunas podem ser alterados. Uma “combinação” de INSERT com UPDATE.
Para determinar se um registro (linha) já existe na tabela, são usados os valores de chave primária ou coluna com constraint UNIQUE na tabela. Se a tabela não possuir esses índices, a declaração REPLACE funciona como um INSERT simples.
Para usar o REPLACE em MySQL é necessário ter privilégios para executar as instruções INSERT e DELETE.
Como inserir uma nova linha com REPLACE no MySQL
Sintaxe:
REPLACE [INTO] nomeTabela(lista_colunas) VALUES(lista_valores);
Como podemos ver, uma sintaxe bem parecida com a da declaração INSERT!
Vejamos um exemplo.
Exemplos
Vejamos como inserir e modificar registros em uma tabela no MySQL usando a declaração REPLACE.
Primeiramente, criamos uma nova tabela para testes:
# Tabela para testes da declaração REPLACE
CREATE TABLE paises (
IdPais Tinyint AUTO_INCREMENT,
nomePais VARCGAR(25) UNIQUE NOT NULL,
nomeCapital VARCGAR(50) NOT NULL,
CONSTRAINT pk_id_pais PRIMARY KEY(IdPais)
);
Populamos a tabela com alguns registros:
INSERT INTO paises(nomePais, nomeCapital) VALUES ('Argentina','Buenos Aires'),('Brasil','Brasilia'), ('Equador','Quito'),('Namíbia','Windhoek'), ('Bélgica','Bruxelas'),('China','Pequim'), ('Espanha','Sevilha'),('Marrocos','Rabat');
Note que um dos registros tem um valor errado – a capital da Espanha é Madrid, e não Sevilha. Vamos consertar isso posteriormente.
Vamos visualizar a tabela com seu conteúdo:
SELECT * FROM paises;
As linhas foram inseridas com sucesso, mas um dos registros – Espanha – foi inserido com valor errado para sua capital, que é Madrid, e não Sevilha. Vamos inserir o registro novamente, como uma nova linha, usando uma declaração INSERT comum:
INSERT INTO paises(nomePais, nomeCapital) VALUES ('Espanha','Madrid');
Note que foi gerado um erro, pois o país Espanha já está cadastrado – e a coluna nomePais possui a restrição UNIQUE configurada, o que significa que não são aceitos valores repetidos nesta coluna.
Vamos usar agora a instrução REPLACE para trocar os dados do país incorreto:
REPLACE INTO paises(IdPais, nomePais, nomeCapital) VALUES (7, 'Espanha', 'Madrid');
Note que fornecemos nesta declaração o ID do país (7), valor da chave primária do registro, para que o valor atual seja substituído, e não um novo registro criado.
Vamos visualizar a tabela modificada:
SELECT * FROM paises;
Note que o nome da capital foi alterado, sem alterar o valor da chave primária – exatamente como uma declaração UPDATE faria.
Mas, o que acontece se eu não fornecer a chave primária ao executar um REPLACE? Vamos testar isso.
A capital da Namíbia é Windhoek, como está registrado na tabela. Mas existe um nome aportuguesado para esta cidade: Vinduque. Vamos tentar trocar o nome da capital da Namíbia usando REPLACE, mas agora sem fornecer o valor da chave primária (que é 4):
REPLACE INTO paises(nomePais, nomeCapital) VALUES ('Namíbia', 'Vinduque');
Vejamos o que aconteceu:
SELECT * FROM paises;
Neste caso, foi usado o valor padrão da coluna IdPais, pois não fornecemos um valor para a chave primária. E, no caso, trata-se de uma coluna de auto incremento, e assim valor padrão é um novo numero na sequência de valores – ou seja, uma nova chave primária (no caso, 10).
Não ocorreu um update da linha Namíbia, o que podemos ver claramente pois o Id do país (chave primária) mudou – isso indica que o registro atual foi excluído e um novo registro foi criado.
E se o registro não existisse previamente na tabela? O que ocorreria ao tentar usar o REPLACE?
Neste caso um novo registro é criado. Tente isso com exercício – use o REPLACE com os seguintes dados:
- País: Angola
- Capital: Luanda
Se quiser, poste o código usado e o resultado obtido nos comentários aqui abaixo – e quaisquer dúvidas que vocês tenham!
Até!
— usando um replace , sem registro na tabela:
replace into tbl_paises(nomePais, nomeCapital)
values (‘Angola’,’Luanda’);