Inserir chave primária de incremento automático na tabela existente

157

Estou tentando alterar uma tabela que não tem chave primária nem coluna auto_increment. Eu sei como adicionar uma coluna de chave primária, mas fiquei imaginando se é possível inserir dados na coluna de chave primária automaticamente (já tenho 500 linhas no banco de dados e quero dar o ID, mas não quero fazê-lo manualmente) . Alguma ideia? Muito obrigado.

FlyingCat
fonte
2
Você pode facilmente fazer isso alter tablepara adicionar a chave, mas o MySQL não gera IDs para campos que ainda não os possuem. Você precisará atualizar manualmente os campos existentes e garantir que seu novo incremento automático inicie com o deslocamento correto - o padrão é '1' e você acabaria com erros de chave duplicados.
Marc B
3
@ MarcB Acabei de testar, e ele realmente inseriu os IDs das linhas existentes a partir de 1
Michael Berkowski

Respostas:

253

Uma ALTER TABLEdeclaração adicionando a PRIMARY KEYcoluna funciona corretamente em meus testes:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

Em uma tabela temporária criada para fins de teste, a instrução acima criou a AUTO_INCREMENT idcoluna e inseriu valores de incremento automático para cada linha existente na tabela, começando com 1.

Michael Berkowski
fonte
1
Sim, esta tem sido a minha experiência. Nunca me lembro de ter para executar um script separado para preencher auto_increment ids ...
Mike Purcell
1
lol obrigado. foi mal. A marca verde é para você, pois a sua é mais fácil de implementar. : D
FlyingCat
53
Para torná-la a primeira coluna, use FIRSTpor exemploALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas
1
A mecânica do @Nikkie SQLite é bem diferente. Você encontrará sugestões aqui stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski
1
@WijaySharma Se você criou a linha com incremento automático e deve recuperá-la por ID imediatamente, o MySQL oferece LAST_INSERT_ID()esse valor SELECT * FROM table_name WHERE id = LAST_INSERT_ID()e a maioria das APIs da linguagem de programação oferece alguma função / método para retornar esse valor no código do aplicativo.
Michael Berkowski
51

suponha que você não tenha coluna para incremento automático, como id, no, adicione-a usando a seguinte consulta:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

Se você tiver uma coluna, altere para o incremento automático usando a seguinte consulta:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
php
fonte
1
O que faz FIRSTno final?
Dementic
1
Tornará a nova idcoluna a primeira da tabela, em oposição à última, que é o comportamento padrão.
Fmalina
Trabalhando bem! Obrigado!
Majedur Rahaman 16/01
4

sim, algo como isso faria isso, talvez não seja o melhor, você pode querer fazer um backup

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

observe que o que any_fieldvocê selecionou deve ser o mesmo durante a atualização.

Grigor
fonte
4

Para pessoas como eu, obtendo um Multiple primary key definederro, tente:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

No MySQL v5.5.31, isso definiu a idcoluna como a chave primária para mim e preencheu cada linha com um valor incremental.

reflexiv
fonte
2

O mais fácil e rápido que eu acho é esse

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);
Dave
fonte
2

Consegui adaptar essas instruções, pegue uma tabela com uma chave primária sem incremento existente e adicione uma chave primária com incremento à tabela e crie uma nova chave primária composta com as chaves antigas e novas como uma chave primária composta usando o seguinte código:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

Quando isso é feito, o campo _USER_ID existe e possui todos os valores numéricos da chave primária exatamente como você esperaria. Com a "DROP TABLE" na parte superior, você pode executar isso repetidamente para experimentar variações.

O que não consegui trabalhar é a situação em que há FOREIGN KEYs de entrada que já apontam para o campo USER_ID. Recebo essa mensagem quando tento fazer um exemplo mais complexo com uma chave estrangeira recebida de outra tabela.

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

Eu estou supondo que eu preciso derrubar todas as chaves estrangeiras antes de fazer a tabela ALTER e depois reconstruí-las depois. Por enquanto, porém, eu queria compartilhar essa solução com uma versão mais desafiadora da pergunta original, caso outras pessoas entrassem nessa situação.

drchuck
fonte
0

Exporte sua tabela, esvazie sua tabela, adicione campo como INT exclusivo, altere-o para AUTO_INCREMENT e importe sua tabela novamente exportada anteriormente.

David C
fonte
0

Você pode adicionar uma nova coluna Chave Primária a uma tabela existente, que pode ter números de sequência, usando o comando:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
Nagesh Hugar
fonte
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828
0

Eu estava enfrentando o mesmo problema, então o que fiz soltei o campo da chave primária, depois recriei-a e verifiquei que ela é incremental automática. Isso funcionou para mim. Espero que ajude os outros

Humphrey
fonte
0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NÃO NULL AUTO_INCREMENT ;

Aqui tableName é o nome da sua tabela,

tableName é o nome da sua coluna principal, que deve ser modificado

MEDIUMINT é um tipo de dados da sua chave primária existente

AUTO_INCREMENT, você precisa adicionar apenas auto_increment após não nulo

Isso tornará a chave primária auto_increment ......

Espero que seja útil :)

Hrushikesh vanga
fonte
1
Seria útil se você editar e adicionar alguma explicação.
Shashanth 02/09/19
-1

Como escrever PHP para alterar o campo já existente (nome, neste exemplo) para torná-lo uma chave primária? É claro que sem adicionar campos 'id' adicionais à tabela.

Esta tabela foi criada atualmente - Número de registros encontrados: 4 nome VARCHAR (20) SIM raça VARCHAR (30) SIM cor VARCHAR (20) SIM peso SMALLINT (7) SIM

Esse é um resultado final buscado (TABELA DESCRIÇÃO) -

Número de registros encontrados: 4 nome VARCHAR (20) NÃO PRI raça VARCHAR (30) SIM cor VARCHAR (20) SIM peso SMALLINT (7) SIM

Em vez de conseguir isso -

Número de registros encontrados: 5 id int (11) NENHUM nome PRI VARCHAR (20) SIM raça VARCHAR (30) SIM cor VARCHAR (20) SIM peso SMALLINT (7) SIM

depois de tentar ..

$ query = "ALTER TABLE cavalos de corrida ADD id INT NÃO NULL AUTO_INCREMENT PRIMEIRO, ADD PRIMARY KEY (id)";

Como conseguir isso? -

Número de registros encontrados: 4 nome VARCHAR (20) NÃO PRI raça VARCHAR (30) SIM cor VARCHAR (20) SIM peso SMALLINT (7) SIM

ou seja, INSERIR / ADICIONAR ... etc. a chave primária NO primeiro registro de campo (sem adicionar um campo 'id' adicional, como declarado anteriormente.

De Teague
fonte