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'

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top