Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Posso usar ON DUPLICATE KEY UPDATE com uma consulta INSERT usando a opção SET?


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.