Na atualização da chave duplicada, igual à inserção

Eu procurei por aí, mas não achei que fosse 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 tem um “índice exclusivo”, então não pode haver dois deles. Agora, se o mesmo id já estiver presente no database, eu gostaria de atualizá-lo. Mas eu realmente tenho que 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 já na inserção …

Uma nota extra, eu gostaria de usar o trabalho em torno de obter o ID para!

 id=LAST_INSERT_ID(id) 

Espero que alguém possa me dizer qual é o caminho mais eficiente.

A UPDATE é fornecida para que os campos mais antigos possam ser atualizados para o novo valor. Se os seus valores mais antigos são iguais aos seus novos, por que você precisaria atualizá-lo em qualquer caso?

Por exemplo se suas colunas a a g já estão definidas como 2 a 8 ; não haveria necessidade de atualizá-lo novamente.

Como alternativa, você pode usar:

 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=a, b=b, c=c, d=d, e=e, f=f, g=g; 

Para obter o id de LAST_INSERT_ID ; você precisa especificar o aplicativo de backend que está usando para o mesmo.

Para LuaSQL, um conn:getlastautoid() busca o valor.

Existe uma extensão específica do MySQL para SQL que pode ser o que você quer – REPLACE INTO

No entanto, não funciona da mesma forma que ‘ON DUPLICATE UPDATE’

  1. Exclui a linha antiga que colide com a nova linha e, em seguida, insere a nova linha. Contanto que você não tenha uma chave primária na tabela, tudo bem, mas se você fizer isso, então se qualquer outra tabela fizer referência a essa chave primária

  2. Você não pode referenciar os valores nas linhas antigas, então você não pode fazer o equivalente a

     INSERT INTO mytable (id, a, b, c) values ( 1, 2, 3, 4) ON DUPLICATE KEY UPDATE id=1, a=2, b=3, c=c + 1; 

Eu gostaria de usar o trabalho para obter o ID para!

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 para você, pois exclui a linha antiga que entrou em conflito por meio da chave exclusiva.

Alguém sugeriu antes que você possa reduzir alguma digitação fazendo:

 INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3) ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`); 

Não há outro jeito, tenho que especificar tudo duas vezes. Primeiro para a inserção, segundo no caso de atualização.

Aqui está uma solução para o seu problema:

Eu tentei resolver um problema como o seu e eu quero sugerir para testar a partir de um aspecto simples.

Siga estas etapas: Aprenda com uma solução simples.

Etapa 1: crie um esquema de tabela usando esta consulta SQL:

 CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(32) NOT NULL, `status` tinyint(1) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `no_duplicate` (`username`,`password`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; 

Uma tabela <code/> user </ code> com dados”> </p>
<p>  Etapa 2: <strong>crie um índice de duas colunas</strong> para evitar dados duplicados usando a seguinte consulta SQL: </p>
<pre> <code>ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);</code> </pre>
<p>  ou <strong>Crie um índice de duas colunas da GUI da</strong> seguinte maneira: <img src= Selecione colunas para criar o índice Índices da tabela <code/> user </ code>“> </p>
<p>  Etapa 3: <strong>atualize se existir, insira se não estiver</strong> usando as seguintes consultas: </p>
<pre> <code>INSERT INTO `user`(`username`, `password`) VALUES ('ersks','Nepal') ON DUPLICATE KEY UPDATE `username`='master',`password`='Nepal'; INSERT INTO `user`(`username`, `password`) VALUES ('master','Nepal') ON DUPLICATE KEY UPDATE `username`='ersks',`password`='Nepal';</code> </pre>
<p> <img src=

Apenas no caso de você ser capaz de utilizar uma linguagem de script para preparar suas consultas SQL, você pode reutilizar pares de campo = valor usando SET vez de (a,b,c) VALUES(a,b,c) .

Um exemplo com PHP:

 $pairs = "a=$a,b=$b,c=$c"; $query = "INSERT INTO $table SET $pairs ON DUPLICATE KEY UPDATE $pairs"; 

Tabela de exemplo:

 CREATE TABLE IF NOT EXISTS `tester` ( `a` int(11) NOT NULL, `b` varchar(50) NOT NULL, `c` text NOT NULL, UNIQUE KEY `a` (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Você pode querer considerar o uso da syntax REPLACE INTO , mas esteja avisado, depois de duplicar a chave PRIMARY / UNIQUE, DELETA a linha e INSERTARá 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:

  • Se você tiver a chave primária AUTO_INCREMENT, ela receberá uma nova
  • Os índices provavelmente precisarão ser atualizados

você pode usar insert ignore para tal caso, ele irá ignorar se ele obtiver registros duplicados INSERT IGNORE …; – sem ON DUPLICATE KEY