faire un ID dans un incrément de table mysql auto (après le fait)

j'ai acquis une base de données d'un autre développeur. Il n'a pas utilisé d'incréments automatiques sur les tables. Ils ont tous des clés primaires, mais il a fait toute l'incrémentation manuellement,en code.

puis-je les transformer en incréments automatiques maintenant?


Wow, très bien, merci une tonne. Ça a marché sans accroc sur une de mes tables. Mais une deuxième table, je reçois cette erreur...Erreur sur renommer".DBNAME#sql-6c8_62259c ' to '.DBNAMEdealer_master_events '

53
demandé sur casperOne 2008-10-30 22:41:26

6 réponses

par exemple, voici une table qui a une clé primaire mais qui n'est pas AUTO_INCREMENT :

mysql> CREATE TABLE foo (
  id INT NOT NULL,
  PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);

vous pouvez MODIFY la colonne pour le redéfinir avec l'option AUTO_INCREMENT :

mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;

Vérifier cela a pris effet:

mysql> SHOW CREATE TABLE foo;

sorties:

CREATE TABLE foo (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

notez que vous avez modifié la définition de la colonne en place, sans avoir besoin de créer une deuxième colonne et chute de la colonne d'origine. Le PRIMARY KEY contrainte n'est pas affectée, et vous n'avez pas besoin de mentionner dans la ALTER TABLE .

ensuite vous pouvez tester qu'un insert génère une nouvelle valeur:

mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;

sorties:

+----+
| id |
+----+
|  1 | 
|  2 | 
|  5 | 
|  6 | 
+----+
4 rows in set (0.00 sec)

j'ai testé cela sur MySQL 5.0.51 sur Mac OS X.

j'ai aussi testé avec ENGINE=InnoDB et une table dépendante. Modification de la colonne id la définition n'interrompt pas l'intégrité référentielle.


pour répondre à l'erreur 150 que vous avez mentionnée dans votre commentaire, c'est probablement un conflit avec les contraintes de clé étrangère. Mes excuses, après l'avoir testé, j'ai pensé que ça marcherait. Voici quelques liens qui peuvent aider à diagnostiquer le problème:

99
répondu Bill Karwin 2017-05-23 11:54:19

je suppose que vous n'avez pas besoin de re-incrémenter les données existantes alors, pourquoi ne pouvez-vous pas simplement exécuter une commande ALTER TABLE pour changer les attributs de PK?

quelque chose comme:

ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT 

j'ai testé ce code sur ma propre base de données MySQL et il fonctionne, mais je ne l'ai pas essayé avec un nombre significatif d'enregistrements. Une fois que vous avez modifié la rangée, vous devez réinitialiser l'incrément à un nombre garanti pour ne pas interférer avec d'autres dossier.

ALTER TABLE `content` auto_increment = MAX(`id`) + 1

encore une fois, non testé mais je crois que ça va marcher.

4
répondu Stephen Walcher 2008-10-30 20:11:19

rien de ce qui précède ne fonctionnait pour ma table. J'ai une table avec un entier non signé comme clé primaire avec des valeurs allant de 0 à 31543. Actuellement, il y a plus de 19 000 enregistrements. J'ai dû modifier la colonne en AUTO_INCREMENT ( MODIFY COLUMN 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT ) et mettre la graine( AUTO_INCREMENT = 31544 ) dans la même déclaration.

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
4
répondu Michael A. Griffey 2012-08-02 17:35:30

cela a fonctionné pour moi (je voulais faire id primaire et mettre auto increment)

MODIFIER LA TABLE table_name MODIFIER LA TABLE id id INT AUGMENTATION AUTOMATIQUE DE LA CLÉ PRIMAIRE;

2
répondu 2014-02-21 21:34:00

Oui, facile. Il suffit d'exécuter une requête de définition de données pour mettre à jour les tables, en ajoutant une colonne AUTO_ incrément.

si vous avez une base de données existante, veillez à préserver toute relation de clé étrangère qui pourrait déjà exister sur les clés primaires" créées artificiellement".

0
répondu Alex Weinstein 2008-10-30 19:55:38

aussi longtemps que vous avez des entiers uniques (ou une valeur unique) dans le PK actuel, vous pouvez créer une nouvelle table, et y insérer avec L'insertion D'identité sur. Puis laissez tomber l'ancienne table, et renommez la nouvelle table.

N'oubliez pas de recréer les index.

-1
répondu Adam 2008-10-30 19:54:40