Eu procurei, mas não encontrei se é possível.
Eu tenho esta consulta MySQL:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
O ID do campo possui um "índice exclusivo", portanto não pode haver dois deles. Agora, se o mesmo ID já estiver presente no banco de dados, eu gostaria de atualizá-lo. Mas realmente preciso especificar todos esses campos novamente, como:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8
Ou:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)
Eu especifiquei tudo que já está na inserção ...
Uma observação extra, eu gostaria de usar a solução alternativa para obter o ID!
id=LAST_INSERT_ID(id)
Espero que alguém possa me dizer qual é a maneira mais eficiente.
a=VALUES(a), b=VALUES(b), ...
é o caminho que você precisa seguir. É assim que faço em todas as minhasINSERT ON DUPLICATE KEY UPDATE
declarações.Respostas:
A
UPDATE
instrução é fornecida para que os campos mais antigos possam ser atualizados para um novo valor. Se seus valores mais antigos são iguais aos novos, por que você precisaria atualizá-lo?Por exemplo. se as colunas
a
parag
já estão definidos como2
para8
; não haveria necessidade de atualizá-lo novamente.Como alternativa, você pode usar:
Para obter o
id
deLAST_INSERT_ID
; você precisa especificar o aplicativo de back-end que está usando para o mesmo.Para LuaSQL, a
conn:getlastautoid()
busca o valor.fonte
tbl
já tiver linha (1,10), então:INSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=VALUES(a)
configurará a = 2 . EnquantoINSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=a
definirá a = 10a=a
atualizações nada. (As consultas na pergunta original realmente não atualizar qualquer coisa qualquer, mas uma atualização parece ser o que o OP pretendido.)Existe uma extensão específica do MySQL para SQL que pode ser o que você deseja -
REPLACE INTO
No entanto, ele não funciona da mesma forma que 'ON DUPLICATE UPDATE'
Exclui a linha antiga que entra em conflito com a nova linha e insere a nova linha. Contanto que você não tenha uma chave primária na tabela, tudo bem, mas se você tiver, então se alguma outra tabela fizer referência a essa chave primária
Você não pode fazer referência aos valores nas linhas antigas, portanto não pode fazer o equivalente a
Isso deve funcionar - last_insert_id () deve ter o valor correto, desde que sua chave primária seja incrementada automaticamente.
No entanto, como eu disse, se você realmente usar essa chave primária em outras tabelas,
REPLACE INTO
provavelmente não será aceitável, pois exclui a linha antiga que se chocou por meio da chave exclusiva.Alguém sugeriu antes que você possa reduzir a digitação fazendo:
fonte
replace into
consulta?Não há outra maneira, eu tenho que especificar tudo duas vezes. Primeiro para a inserção, segundo no caso de atualização.
fonte
Aqui está uma solução para o seu problema:
Eu tentei resolver um problema como o seu e quero sugerir que teste de um aspecto simples.
Siga estas etapas: Aprenda com uma solução simples.
Etapa 1: Crie um esquema de tabela usando esta Consulta SQL:
Etapa 2: Crie um índice de duas colunas para evitar dados duplicados usando a seguinte Consulta SQL:
ou Crie um índice de duas colunas da GUI da seguinte maneira:
Etapa 3: atualize, se existir, insira, se não estiver usando as seguintes consultas:
fonte
Caso você seja capaz de utilizar uma linguagem de script para preparar suas consultas SQL, você pode reutilizar pares campo = valor usando em
SET
vez de(a,b,c) VALUES(a,b,c)
.Um exemplo com PHP:
Tabela de exemplo:
fonte
Você pode considerar o uso de
REPLACE INTO
sintaxe, mas, ao ser avisado, ao duplicar a chave PRIMARY / UNIQUE, DELETE a linha e INSIRA uma nova.Você não precisará especificar novamente todos os campos. No entanto, você deve considerar a possível redução de desempenho (depende do design da sua tabela).
Ressalvas:
fonte
Eu sei que é tarde, mas espero que alguém seja ajudado com esta resposta
Você pode ler o tutorial abaixo aqui:
fonte
new
:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
você pode usar insert ignore nesse caso, ele ignorará se receber registros duplicados INSERT IGNORE ...; - sem CHAVE DUPLICADA
fonte