insert into table select * from table where primarykey=1
Eu só quero copiar uma linha para inserir na mesma tabela (ou seja, desejo duplicar uma linha existente na tabela), mas quero fazer isso sem precisar listar todas as colunas após o "select", porque esta tabela possui muitas colunas.
Mas quando faço isso, recebo o erro:
Entrada duplicada 'xxx' para a chave 1
Eu posso lidar com isso criando outra tabela com as mesmas colunas que um contêiner temporário para o registro que quero copiar:
create table oldtable_temp like oldtable;
insert into oldtable_temp select * from oldtable where key=1;
update oldtable_tem set key=2;
insert into oldtable select * from oldtable where key=2;
Existe uma maneira mais simples de resolver isso?
mysql
copy
duplicates
row
lina
fonte
fonte
max(oldtable.id) + oldtable_temp.key
para garantir que os IDs aumentem e sejam únicos.Respostas:
Usei a técnica de Leonard Challis com algumas mudanças:
Como uma tabela temporária, nunca deve haver mais de um registro; portanto, você não precisa se preocupar com a chave primária. Configurá-lo como nulo permite que o MySQL escolha o valor em si, então não há risco de criar uma duplicata.
Se você quiser ter certeza de que está inserindo apenas uma linha, adicione LIMIT 1 ao final da linha INSERT INTO.
Observe que também anexei o valor da chave primária (1 neste caso) ao meu nome de tabela temporário.
fonte
tmptable_1
vs.tmptable
)primarykey
INT NULL; depois da primeira linha para fazer o trabalho soluçãoAtualização 07/07/2014 - A resposta com base em minha resposta, de Grim ... , é uma solução melhor, pois melhora minha solução abaixo, então sugiro usá-la.
Você pode fazer isso sem listar todas as colunas com a seguinte sintaxe:
Você pode alterar a chave primária de outra maneira.
fonte
tmptable
, você não precisa adicionar aWHERE primarykey = 2
instrução para a última linha também. (Ou seja, apenasINSERT INTO table SELECT * FROM tmptable
.) #Estou assumindo que você deseja que o novo disco tenha um novo
primarykey
? Seprimarykey
forAUTO_INCREMENT
, faça o seguinte:... onde
col1, col2, col3, ...
estão todas as colunas da tabela, excetoprimarykey
.Se não é uma
AUTO_INCREMENT
coluna e você deseja escolher o novo valorprimarykey
, é semelhante:... para onde
567
está o novo valorprimarykey
.fonte
Você quase a teve na sua primeira consulta, apenas especificando as colunas; dessa forma, você pode excluir sua chave primária na inserção, o que aumentará o incremento automático que você provavelmente terá na tabela para criar automaticamente uma nova chave primária para a coluna. entrada.
Por exemplo, altere isso:
Para isso:
Apenas não inclua a coluna primarykey na lista de colunas para as partes INSERT ou SELECT da consulta.
fonte
insert into table ("val1", col2, col3) select col2, col3 from table where primarykey = 1
ou algo semelhante?Você também pode tentar despejar a tabela, localizando o comando insert e editando-o:
O
--skip-extended-insert
fornece um comando de inserção por linha. Você pode encontrar a linha no seu editor de texto favorito, extrair o comando e alterar a chave primária para "padrão".fonte
Este procedimento supõe que:
É claro que isso não é perfeito, mas em alguns casos (provavelmente na maioria) ele funcionará.
fonte
works
mas a abordagem é sólida e tem valor, pois é única aqui e realmente aborda a questão do OP.Isso pode ser alcançado com alguma criatividade:
Isso fará com que a nova linha obtenha um ID incrementado automaticamente em vez do ID da linha selecionada.
fonte
Se o campo de chave primária da sua tabela for um campo de incremento automático, você poderá usar a consulta com colunas. Por exemplo, sua tabela denominada
test_tbl
possui 3 campos comoid, name, age
.id
é um campo de chave primária e incremento automático, para que você possa usar a seguinte consulta para duplicar a linha:Essa consulta resulta na duplicação de cada linha.
Se o campo de chave primária da sua tabela não for um campo de incremento automático, você poderá usar o seguinte método:
O resultado desta consulta é uma linha duplicada de
id=19
inserida comoid=20
.fonte
tableName
(fieldName1
,fieldName2
,fieldName3
) SelecionefieldName1
,fieldName2
,fieldName3
DEtableName
ONDE 1 (para copiar todos eles de uma vez)clonar linha com campos de atualização e valor de incremento automático
fonte
Alguns dos itens a seguir foram recolhidos deste site. Isto é o que eu fiz para duplicar um registro em uma tabela com qualquer número de campos:
Isso também pressupõe que você tenha um campo de AI no início da tabela
fonte
Eu posso estar atrasado nisso, mas tenho uma solução semelhante que funcionou para mim.
Dessa forma, não preciso criar uma tabela temporária e etc. Como a linha é copiada na mesma tabela, a
Max(PK)+1
função pode ser usada facilmente.Eu vim procurando a solução desta questão (tinha esquecido a sintaxe) e acabei fazendo minha própria consulta. Engraçado como as coisas funcionam algumas vezes.
Saudações
fonte
Se a Chave Primária for Incremento Automático, basta especificar cada campo, exceto a Chave Primária.
INSERT INTO table(field1,field2,field3) SELECT (field1,field2,field3) FROM table WHERE primarykey=1
fonte
Atualizei a solução da @ LeonardChallis, pois não funcionou para mim como nenhuma das outras. Eu removi as
WHERE
cláusulas eSET primaryKey = 0
na tabela temporária para que o MySQL incrementasse automaticamente a primaryKeyObviamente, isso duplicará todas as linhas da tabela.
fonte
Eu usei a técnica de Grim com uma pequena alteração: se alguém procurando por essa consulta é porque não pode fazer uma consulta simples devido ao problema da chave primária:
Com minha instalação do MySql 5.6.26, a chave não é anulável e produz um erro:
Então, depois de criar a tabela temporária, altero a chave primária para ser anulável.
fonte
Eu usaria abaixo,
fonte
Eu usei no meu banco de dados Koha para inserir itens duplicados com o prefixo 'C' na coluna de código de barras :
fonte
Eu apenas tive que fazer isso e esta foi a minha solução manual:
Se você não sabe qual é o campo PRIMARY , olhe novamente para a sua página phpmyadmin , clique na guia 'Estrutura' e, na parte inferior da página, em 'Índices', ele mostrará qual 'Campo' possui um 'Nome-chave' valor 'PRIMARY' .
Um longo caminho, mas se você não quiser lidar com a marcação e apenas precisar duplicar uma única linha, lá está.
fonte
Esta solução mostrada acima funciona perfeitamente também para linhas selecionadas. Por exemplo, estou criando linhas de demonstração para o meu projeto nice2work, e isso funciona perfeitamente.
fonte
Desculpem o necropost, mas foi o que descobri no google e, como achei útil, mas problemático, quis contribuir com uma modificação importante para qualquer um que descobrir isso.
Primeiro, estou usando o SQL Server, não o MySQL, mas acho que deve funcionar da mesma forma. Usei a solução de Leonard Challis porque era mais simples e atendia à necessidade, mas há um problema com isso - se você simplesmente pegar a PK e aumentá-la em 1, o que acontecerá se você tiver adicionado outros registros desde que a linha em questão foi adicionada . Decidi que era melhor deixar o sistema lidar com o incremento automático do PK, então fiz o seguinte:
Eu acredito que isso funcionaria da mesma forma no MySQL, mas não posso testar isso, desculpe
fonte
Eu sei que é uma pergunta antiga, mas aqui está outra solução:
Isso duplica uma linha na tabela principal, supondo que a chave primária seja incrementada automaticamente e cria cópias dos dados das tabelas vinculadas com o novo ID da tabela principal.
Outras opções para obter nomes de colunas:
-SHOW COLUMNS FROM
tablename
; (Nome da coluna: Campo)-DESCRIBE
tablename
(Nome da coluna: Campo)-SELECT column_name FROM information_schema.columns WHERE table_name = 'tablename' (nome da coluna: column_name)
fonte
O max233 certamente estava no caminho certo, pelo menos no caso de incremento automático. No entanto, não faça a ALTER TABLE. Basta definir o campo de incremento automático na tabela temporária como NULL. Isso apresentará um erro, mas o seguinte INSERT de todos os campos na tabela temporária ocorrerá e o campo automático NULL obterá um valor exclusivo.
fonte
Crie uma tabela
Inserir uma linha
Clonar inserção de linha acima
Teste
fonte
Aqui está uma resposta que encontrei on-line neste site Descreve como fazer o acima 1 Você pode encontrar a resposta na parte inferior da página. Basicamente, o que você faz é copiar a linha a ser copiada para uma tabela temporária mantida na memória. Você altera o número da Chave Primária usando a atualização. Em seguida, insira-o novamente na tabela de destino. Você então solta a mesa.
Este é o código para ele:
Eu criei a equipe de resgate da tabela temporária. Copiei a linha da tabela original fitnessreport4. Em seguida, defino a chave primária da linha na tabela temporária como nula, para que eu possa copiá-la novamente para a tabela original sem obter um erro de Chave duplicada. Eu tentei esse código ontem à noite e funcionou.
fonte
Esta é uma solução adicional para a resposta "Grim ..." Houve alguns comentários sobre a chave primária como nula. Alguns comentários sobre isso não estão funcionando. E alguns comentários sobre soluções. Nenhuma das soluções funcionou para nós. Temos o MariaDB com a tabela InnoDB.
Não foi possível definir a chave primária para permitir nulo. Usar 0 em vez de NULL levou a um erro de valor duplicado para a chave primária.
SET SQL_SAFE_UPDATES = 0;
Também não funcionou.A solução de "Grim ..." funcionou SE mudássemos nossa CHAVE PRIMÁRIA para UNIQUE
fonte
Só queria postar meu código PHP, porque acho que a maneira como coleciono as colunas é um pouco mais limpa no código do que nos exemplos anteriores. Isso também mostra como você pode alterar facilmente um campo, neste caso adicionando uma string. Mas você também pode substituir um campo de chave estrangeira pelo registro recém-adicionado, caso deseje copiar também alguns registros filhos.
fonte
Para uma solução muito simples, você pode usar o PHPMyAdmin para exportar a linha como um arquivo CSV e simplesmente importar o arquivo CSV alterado. Editando a coluna ID / primarykey para não mostrar valor antes de importá-lo.
Então, na parte inferior da página:
Onde se diz "Exportar", simplesmente exporte, edite o arquivo csv para remover o valor da chave primária, para que fique vazio e depois importe-o para o banco de dados, uma nova chave primária será atribuída na importação.
fonte