Question

J'ai une table "bestelling" avec 4 colonnes: "id" (pk), "klantid", "datum", "bessellingstypeid", maintenant je veux faire l'identifiant de colonne auto_increment, cependant, lorsque j'essaie de le faire, je suis Obtenez cette erreur:

ERROR 1062: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'

SQL Statement:

ALTER TABLE `aafest`.`aafest_bestelling` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT



ERROR: Error when running failback script. Details follow.



ERROR 1046: No database selected

SQL Statement:

CREATE TABLE `aafest_bestelling` (

  `Id` int(11) NOT NULL,

  `KlantId` int(11) DEFAULT NULL,

  `Datum` date DEFAULT NULL,

  `BestellingstypeId` int(11) DEFAULT NULL,

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

Quelqu'un a une idée?

Était-ce utile?

La solution

Cela se produira si le tableau contient un enregistrement existant avec un ID de 0 (ou négatif). La mise à jour de tous les enregistrements existants pour utiliser des valeurs positives permettra à Auto_Increment d'être définie sur cette colonne.

EDIT: Certaines personnes ont demandé comment ce 0 s'y est passé. Pour clarification, le manuel de référence MySQL indique que "pour les types numériques, la valeur par défaut est 0, à l'exception que pour les types entiers ou à virgule flottante déclarés avec l'attribut Auto_increment, la valeur par défaut est la valeur suivante de la séquence." Ainsi, si vous effectuez un insert sur une table sans fournir de valeur pour la colonne numérique avant l'activation de l'auto_increment, la valeur par défaut serait utilisée pendant l'insert. Plus de détails peuvent être trouvés à https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html.

Autres conseils

J'ai également eu ce problème lorsque je essayais de convertir une colonne en auto_increment où une ligne avait une valeur de 0. Une alternative à la modification temporaire de la valeur est via le réglage:

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

pour la session.

Cela a permis à la colonne d'être modifiée en auto_increment avec l'ID zéro en place.

Le zéro n'est pas idéal - et je ne recommanderais pas non plus qu'il soit utilisé dans une colonne Auto_increment. Malheureusement, cela fait partie d'un ensemble de données hérité, donc je suis coincé avec cela pour l'instant.

Mieux vaut effacer le paramètre (et tout autre) par la suite avec:

SET SESSION sql_mode='';

Bien qu'il soit effacé lorsque la session client actuelle ClSoes.

Tous les détails sur le paramètre 'no_auto_value_on_zero' ici.

Cela se produit lorsque MySQL ne peut pas déterminer une valeur auto_increment appropriée. Dans votre cas, MySQL Choisissez 1 Comme la prochaine valeur Auto_increment, mais il y a déjà une ligne avec cette valeur dans le tableau.

Une façon de résoudre le problème est de choisir vous-même une valeur auto_increment appropriée:

ALTER TABLE ... CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 123456;

(Noter la AUTO_INCREMENT=123456 à la fin.)

Éditer: Je ne sais pas exactement comment cela serait causé, mais j'ai une solution de contournement.

Tout d'abord, créez une nouvelle table comme l'ancienne:

CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;

Puis changez la colonne

ALTER TABLE `aafest`.`aafest_bestelling_new` 
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

Vider dans les nouvelles données:

INSERT INTO aafest_bestelling_new
 (KlantId, Datum, BestellingTypeId) 
SELECT 
KlantId, Datum, BestellingTypeId 
FROM aafest_bestelling;

Déplacez les tables:

RENAME TABLE 
aafest_bestelling TO aafest_bestelling_old, 
aafest_bestelling_new TO aafest_bestelling;

Peut-être qu'il y a une corruption en cours, et cela en résulterait également.

PS: En tant que Néerlandais, je recommanderais fortement le codage en anglais;)

La manière la plus simple que j'ai trouvée pour résoudre ce problème est de définir d'abord la table AUTO INCREMENT valeur avant de modifier la colonne. Assurez-vous simplement que vous définissez la valeur d'incrément automatique supérieure à la plus grande valeur actuellement dans cette colonne:

ALTER TABLE `aafest`.`aafest_bestelling` 
AUTO_INCREMENT = 100, 
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

J'ai testé cela sur MySQL 5.7 et cela a très bien fonctionné pour moi.

Cela se produit parce que votre colonne de clé principale a déjà des valeurs.

Comme le dit l'erreur ...

La table alter provoque une redressement Auto_increment, ce qui entraîne une entrée en double «1» pour la clé «primaire»

ce qui signifie que votre colonne a déjà une valeur de clé primaire 1 qui, lorsque vous auto_increment, cette colonne est réaffectée, provoquant une duplication et donc cette erreur

La solution est de supprimer la contrainte principale, puis de vider la colonne. Puis modifiez le tableau en réglant à nouveau la clé primaire, cette fois avec l'incrément automatique.

J'ai eu un problème similaire. Le problème était que la table avait un record avec ID = 0 Semblable à ce que SystemParadox a souligné. J'ai géré mon problème par les étapes suivantes:

Pas:

  1. Mettre à jour l'identification d'enregistrement 0 pour être xx = MAX(id)+1
  2. Modifier la table pour définir la clé primaire et le réglage de l'incrément automatique
  3. Définissez la valeur des semences à être x+1
  4. Modifier l'enregistrement ID x retour à 0

Exemple de code:

UPDATE foo SET id = 100 WHERE id = 0;
ALTER TABLE foo MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE foo AUTO_INCREMENT = 101;
UPDATE foo SET id = 0 WHERE id = 100;

Cette erreur se produira également si vous avez une table myisam qui a un composite AUTO_INCREMENT PRIMARY KEY et essaient de combiner les clés

Par exemple

CREATE TABLE test1 (
 `id` int(11) NOT NULL,
 `ver` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`,`ver`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO test1 (`id`, `ver`) VALUES (1,NULL),(1,NULL),(1,NULL), (2,NULL),(2,NULL),(2,NULL);

ALTER TABLE test1 DROP PRIMARY KEY, ADD PRIMARY KEY(`ver`);

Si le tableau est relatif nouveau avec seulement quelques enregistrements, vous pouvez tronquer le tableau pour réinitialiser les valeurs d'ID:

TRUNCATE TABLE tablename;

Utilisation de Supprimer ne réinitialisera pas les valeurs d'ID.

DELETE FROM tablename;

Une fois le tableau vidé, vous pouvez appliquer l'auto-inférences.

CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top