crea un ID in una tabella mysql auto_increment (dopo il fatto)
-
05-07-2019 - |
Domanda
Ho acquisito un database da un altro sviluppatore. Non ha usato auto_incrementer su nessun tavolo. Tutti hanno ID chiave primaria, ma ha fatto tutto l'incremento manualmente, nel codice.
Posso trasformarli adesso in Auto_incrementer?
Wow, molto gentile, grazie mille. Ha funzionato senza intoppi su uno dei miei tavoli. Ma una seconda tabella, visualizzo questo errore ... Errore durante la ridenominazione di '. \ DBNAME # sql-6c8_62259c' in '. \ DBNAME \ dealer_master_events'
Soluzione
Ad esempio, ecco una tabella che ha una chiave primaria ma non è AUTO_INCREMENT
:
mysql> CREATE TABLE foo (
id INT NOT NULL,
PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
Puoi MODIFICARE
la colonna per ridefinirla con l'opzione AUTO_INCREMENT
:
mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
Verifica che questo abbia avuto effetto:
mysql> SHOW CREATE TABLE foo;
Uscite:
CREATE TABLE foo (
`id` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
Nota che hai modificato la definizione della colonna in atto, senza la necessità di creare una seconda colonna e di eliminare la colonna originale. Il vincolo PRIMARY KEY
non è interessato e non è necessario menzionarlo nell'istruzione ALTER TABLE
.
Successivamente è possibile verificare che un inserto generi un nuovo valore:
mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;
Uscite:
+----+
| id |
+----+
| 1 |
| 2 |
| 5 |
| 6 |
+----+
4 rows in set (0.00 sec)
L'ho provato su MySQL 5.0.51 su Mac OS X.
Ho anche testato con ENGINE = InnoDB
e una tabella dipendente. La modifica della definizione della colonna id
non interrompe l'integrità referenziale.
Per rispondere all'errore 150 che hai citato nel tuo commento, è probabilmente un conflitto con i vincoli della chiave esterna. Mi scuso, dopo averlo provato ho pensato che avrebbe funzionato. Ecco un paio di link che possono aiutare a diagnosticare il problema:
Altri suggerimenti
Nessuno dei precedenti ha funzionato per il mio tavolo. Ho una tabella con un numero intero senza segno come chiave primaria con valori che vanno da 0 a 31543. Attualmente ci sono oltre 19 mila record. Ho dovuto modificare la colonna in AUTO_INCREMENT
( MODIFY COLUMN
'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT
) e impostare il seed ( AUTO_INCREMENT = 31544
) nella stessa dichiarazione.
ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
Suppongo che non sia necessario ri-incrementare i dati esistenti, quindi perché non è possibile eseguire un semplice comando ALTER TABLE per modificare gli attributi del PK?
Qualcosa del tipo:
ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT
Ho testato questo codice sul mio database MySQL e funziona ma non l'ho provato con nessun numero significativo di record. Dopo aver modificato la riga, è necessario reimpostare l'incremento su un numero garantito per non interferire con nessun altro record.
ALTER TABLE `content` auto_increment = MAX(`id`) + 1
Ancora una volta, non testato ma credo che funzionerà.
Questo ha funzionato per me (volevo rendere id primario e impostare l'incremento automatico)
ALTER TABLE table_name
CHANGE id
id
INT PRIMARY KEY AUTO_INCREMENT;
Sì, facile. Basta eseguire una query di definizione dei dati per aggiornare le tabelle, aggiungendo una colonna AUTO_INCREMENT.
Se disponi di un database esistente, fai attenzione a preservare eventuali relazioni di chiave esterna che potrebbero essere già presenti nella "quotazione creata artificialmente" chiavi primarie.
ALTER TABLE `foo` MODIFY COLUMN `bar_id` INT NOT NULL AUTO_INCREMENT;
o
ALTER TABLE `foo` CHANGE `bar_id` `bar_id` INT UNSIGNED NOT NULL AUTO_INCREMENT;
Ma nessuno di questi funzionerà se il tuo bar_id
è una chiave esterna in un'altra tabella: otterrai
an error 1068: Multiple primary key defined
Per risolvere questo problema, disabilitare temporaneamente i controlli dei vincoli di chiave esterna di
set foreign_key_checks = 0;
e dopo aver eseguito le istruzioni precedenti, riattivale.
set foreign_key_checks = 1;
Finché si hanno numeri interi univoci (o un valore univoco) nel PK corrente, è possibile creare una nuova tabella e inserirla con INSERTO IDENTITÀ ON. Quindi rilasciare la vecchia tabella e rinominare la nuova tabella.
Non dimenticare di ricreare qualsiasi indice.