Eu usei
ON DUPLICATE KEY UPDATE
muito. Para algumas situações, é a extensão SQL não padrão que realmente vale a pena usar. Primeiro, você precisa ter uma restrição de chave exclusiva em vigor. A
ON DUPLICATE KEY UPDATE
A função só entra em ação se houver uma violação de chave exclusiva. Aqui está um formato comumente usado:
$query = "INSERT INTO $table (column1, column2, column3)
VALUES ('value-1', 'value-2', 'value-3')
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);"
column1 = values(column1)
significa "Atualizar coluna1 com o valor que teria sido inserido se a consulta não tivesse atingido a violação de chave duplicada." Em outras palavras, significa apenas atualizar a coluna1 para o que teria sido se a inserção funcionasse. Olhando para este código, não parece correto que você esteja atualizando todas as três colunas que está tentando inserir. Qual das colunas tem uma restrição exclusiva?
EDIT:Modifique com base no formato 'SET' da instrução de inserção do mysql de acordo com a pergunta do OP.
Basicamente para usar
ON DUPLICATE KEY UPDATE
, você apenas escreve a instrução insert como faria normalmente, mas adiciona o ON DUPLICATE KEY UPDATE
cláusula pregada no final. Acredito que deve funcionar assim:INSERT INTO $table
set column1 = 'value-1',
column2 = 'value-2',
column3 = 'value-3'
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);
Novamente, uma das colunas que você está inserindo precisa ter um índice exclusivo (ou uma combinação das colunas). Isso pode ser porque um deles é a chave primária ou porque há um índice exclusivo na tabela.