Estou tentando exportar uma tabela com uma rowid
coluna de Incremento Automático e depois importá-la em outro servidor.
Considerando que a coluna é chave primária e não pode aceitar chaves duplicadas se eu importar linhas após o backup do servidor antigo, novas linhas com as mesmas rowid
seriam adicionadas ao novo servidor.
eu também não quero alterar o número inicial para o incremento automático no novo servidor e causar lacunas nas linhas.
então eu pensei que uma solução pode exportar novas linhas sem rowid
e permitir que um novo servidor atribua novas rowid
a elas. mas como posso fazer isso diretamente com mysql ou com ajuda com phpMyAdmin?
Outra solução é usar LOAD DATA [LOCAL] INFILE , mas substituir a lista de colunas para que o valor de incremento automático seja inserido em uma variável fictícia:
Aqui está uma demonstração:
Eu tenho um arquivo de texto que eu chamo
c.csv
:Eu quero inserir em mytable, mas os id's 1,2,3 já estão ocupados. Eu quero que os dados csv sejam inseridos, mas recebam novos ids.
Aqui está uma solução:
Ele adicionou as três linhas do meu arquivo csv, mas a
id
coluna em cada linha de entrada foi desviada para a variável fictícia, então as linhas tiveram que usar o padrão, alocando novos IDs de incremento automático.PS: Você precisa deixar de lado o seu desejo de não ter lacunas na sequência se id's. As lacunas são normais. Você pode excluir algumas linhas no futuro. Você pode tentar uma inserção, mas ela é revertida ou recebe um erro. Há também casos em que o InnoDB gera valores de id não consecutivos por design (leia https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html para obter detalhes).
Aqui está uma maneira rápida e suja de realizar a tarefa:
mysqldump
ou algo no phpMyAdminINSERT INTO {table}
strings na exportação para ter o nome de tabela corretoProvavelmente existem outras maneiras, como um temporário antes
TRIGGER
que substituirá oid
por NULL para que o incremento automático continue, mas o método acima provavelmente seria o mais rápido ...Ao inserir, adicione um número grande (grande o suficiente para ultrapassar os IDs existentes) à
id
coluna das linhas de entrada.Plano A: Carregue em uma tabela temporária e, em seguida,
INSERT .. SELECT id+100000, ... FROM temp
.Plano B:
Advertência: Você não deve estar inserindo na tabela de outras fontes durante o carregamento; ele pode criar um id que entrará em conflito.