REPLACE [LOW_PRIORITY | DELAYED] [INTO] nome_tabela [(nome_coluna,...)] VALUES (expressão,...),(...),... ou REPLACE [LOW_PRIORITY | DELAYED] [INTO] nome_tabela [(nome_coluna,...)] SELECT ... ou REPLACE [LOW_PRIORITY | DELAYED] [INTO] nome_tabela SET nome_coluna=expressão, nome_coluna=expressão,...
REPLACE
funciona exatamente como o
INSERT
, exceto que se um registro antigo na
tabela tem o mesmo valor que um novo registro em um índice
UNIQUE
ou PRIMARY KEY
, o
registro antigo é deletado antes que o novo registro seja
inserido. See Secção 6.4.3, “Sintaxe INSERT
”.
Em outras palavras, você não pode acessar os valores do
registro antigo em uma instrução REPLACE
.
Em algumas versões antigas do MySQL aparentemente você podia
fazer isto, mas era um bug que já foi arrumado.
Par aestar apto a utilizar REPLACE
você deve
ter privilégios INSERT
e
DELETE
para a tabela.
Quando você utilizar um comando REPLACE
,
mysql_affected_rows()
retornará 2 se a nova
linha substituir uma linha antiga. Isto é porque uma linha foi
inserida depois que a linha duplicada foi deletada.
Este fato torna fácil determinar se REPLACE
adicionou ou subsitituiu uma linha: verifique se o valor de
linhas afetadas é 1 (adicionado) ou 2 (substituido).
Note que a menos que a tabela utilize índices
UNIQUE
ou PRIMARY KEY
,
utilizar um comando REPLACE
replace não faz
sentido. Ele se torna equivalente a um
INSERT
, porque não existe índice a ser
usado para determinar se uma nova linha duplica outra.
Seqgue aqui o algoritmo usado em mais detalhes: (Ele também é
usado com LOAD DATA ... REPLACE
.
- Insere a linha na tabela - Enquanto ocorrer erro de chave duplicada para chaves primária ou única - Reverte as chaves alteradas - Le as linha conflitantes da tabela através do valor da chave duplicada - Deleta as linhas conflitantes - Tenta inserir o chave primária e única original na árvore
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.