Já faz um tempo que estou procurando, mas não consigo encontrar uma solução fácil para o meu problema. Eu gostaria de duplicar um registro em uma tabela, mas é claro, a chave primária exclusiva precisa ser atualizada.
Eu tenho esta dúvida:
INSERT INTO invoices
SELECT * FROM invoices AS iv WHERE iv.ID=XXXXX
ON DUPLICATE KEY UPDATE ID = (SELECT MAX(ID)+1 FROM invoices)
o problema é que isso apenas altera o ID
da linha em vez de copiar a linha. Alguém sabe como consertar isso?
// editar: eu gostaria de fazer isso sem digitar todos os nomes de campo porque os nomes de campo podem mudar com o tempo.
CREATE TEMPORARY TABLE tmp SELECT bla FROM invoices WHERE bla; UPDATE tmp SET id=NULL; INSERT INTO invoices SELECT * FROM tmp;
Column 'id' connot be null
A resposta de Alex requer alguns cuidados (por exemplo, bloqueio ou uma transação) em ambientes multi-cliente.
Supondo que o
AUTO ID
campo seja o primeiro da tabela (um caso comum), podemos fazer uso de transações implícitas.Dos documentos do MySQL:
fonte
NULL
ou0
ambos são aceitáveis. Você pode postar capturas de tela do problema reproduzindo e compartilhando aqui.invoices
contém umID
campo AUTO_INCREMENT . A tabela de origemtmp
não. Para obter a correlação 1: 1 necessária durante a inserção, você especifica a0
como o primeiro campo da seleção, que é o campo AUTO_INCREMENT da tabela de destino. Otmp.*
seleciona todos os campos da tabela de origemtmp
. Perfeito! Agora você tem sua correlação 1: 1. Resposta incrível @Tim.NULL
e0
não são iguais. O contexto atual estáAUTO_INCREMENT
ativado. Você não pode inserir um0
ou umNULL
valor em tais campos. Mas quando você usá-los como insumos para tal campo, próximo valor seqüência será atribuído a esse campo auto maticamente. E daí meu comentário. Prova no SQL Fiddle: sqlfiddle.com/#!9/d619f/1Você SABE com certeza que a CHAVE DUPLICADA irá disparar, portanto, você pode selecionar o MAX (ID) +1 de antemão:
fonte
Sua abordagem é boa, mas o problema é que você usa "*" em vez de listar nomes de campos. Se você colocar todos os nomes de colunas, exceto a chave primária, seu script funcionará perfeitamente em um ou mais registros.
INSERT INTO invoices (iv.field_name, iv.field_name,iv.field_name ) SELECT iv.field_name, iv.field_name,iv.field_name FROM invoices AS iv WHERE iv.ID=XXXXX
fonte
Uma resposta tardia, eu sei, mas ainda é uma pergunta comum, gostaria de adicionar outra resposta que funcionou para mim, usando apenas uma
insert into
instrução de uma linha , e eu acho que é simples, sem criar nenhuma nova tabela (uma vez que poderia ser um problema com asCREATE TEMPORARY TABLE
permissões):A solução está funcionando para a
AUTO_INCREMENT
coluna id, caso contrário, você também pode adicionar aID
coluna à instrução:É realmente fácil e direto, você pode atualizar qualquer coisa em uma única linha sem qualquer segunda instrução de atualização para mais tarde (ex: atualizar uma coluna de título com texto extra ou substituir uma string por outra), também você pode ser específico com o que exatamente você deseja duplicar, se tudo for, se houver, você pode fazer isso.
fonte
INSERT into wp_options SELECT NULL, 'theme_mods_twopress', option_value, autoload FROM wp_options where option_name = 'theme_mods_onepress';
copiar enquanto aumentava a entrada (AUTO_INCREMENT
NULL
truque acima) e ooption_name
campo também.Eu só queria estender a ótima resposta de Alex para torná-la apropriada caso você queira duplicar um conjunto inteiro de registros:
Eu só tinha que fazer isso e achei a resposta de Alex um ponto de partida perfeito! Obviamente, você deve definir @x como o número de linha mais alto da tabela (tenho certeza de que você poderia pegar isso com uma consulta). Isso só é útil nesta situação muito específica, portanto, tome cuidado ao usá-lo quando não quiser duplicar todas as linhas. Ajuste a matemática conforme necessário.
fonte
Tenho um problema semelhante, e isto é o que estou fazendo:
Been Preguntas:
Portanto, o
ID
é incrementado automaticamente e também estou usando um valor fixo ('23') paraEncuestaID
.fonte
Eu precisava disso também; minha solução foi usar SQLYOG (versão gratuita) para exportar o registro desejado como SQL (cria uma inserção).
Em seguida, editei manualmente para remover o id, pois ele precisa ser gerado automaticamente e copiei a inserção no SQLYog para executá-lo. Isso foi indolor. Acho que muitas outras GUIs do MySQL também podem fazer isso.
Isso me fornece um registro que posso usar para fins de teste em um sistema ativo.
Agora também tenho este encarte para reutilização, pois a tabela é reescrita diariamente.
fonte
Ligeira variação, a principal diferença sendo definir o campo de chave primária ("varname") como nulo, o que produz um aviso, mas funciona. Ao definir a chave primária como nula, o incremento automático funciona ao inserir o registro na última instrução.
Este código também limpa as tentativas anteriores e pode ser executado mais de uma vez sem problemas:
fonte