J'ai une table "Bestelling" avec 4 colonnes: "Id" (PK), "KlantId", "Datum", "BestellingsTypeId", maintenant je veux faire la colonne Id auto_increment, cependant, quand j'essaye de le faire, je obtenir 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?
Cela se produira si la table contient un enregistrement existant avec un identifiant de 0 (ou négatif). La mise à jour de tous les enregistrements existants pour utiliser des valeurs positives permettra à auto_increment d'être défini sur cette colonne.
Edit: Certaines personnes ont demandé comment ce 0 est entré là-dedans. Pour plus de précision, 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 dans la séquence." Ainsi, si vous avez effectué une insertion sur une table sans fournir de valeur pour la colonne numérique avant l'activation automatique, le 0 par défaut serait utilisé lors de l'insertion. Plus de détails peuvent être trouvés sur https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html .
J'ai également eu ce problème lors de la tentative de conversion d'une colonne en auto_increment où une ligne avait une valeur de 0. Une alternative à la modification temporaire de la valeur 0 consiste à définir:
SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';
pour la session.
Cela a permis à la colonne d'être modifiée en incrémentation automatique 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 pour l'instant.
Il est préférable d'effacer le paramètre (et tout autre) par la suite avec:
SET SESSION sql_mode='';
bien qu'il soit effacé lorsque la session client en cours se termine.
Détails complets 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 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 consiste à 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.)
Edit : Je ne sais pas exactement comment cela serait provoqué, 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 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 de la corruption en cours, et cela réglerait cela également.
P.S .: En tant que Néerlandais, je recommande fortement de coder en anglais;)
Le moyen le plus simple que j'ai trouvé pour résoudre ce problème est de définir d'abord la valeur AUTO INCREMENT
De la table avant de modifier la colonne. Assurez-vous simplement que vous définissez la valeur d'incrémentation 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.
J'ai eu un problème similaire. Le problème était que la table avait un enregistrement avec ID = 0
Similaire à ce que SystemParadox a souligné. J'ai traité mon problème en procédant comme suit:
Étapes:
x
où x = MAX(id)+1
x+1
x
par 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;
Cela se produit car votre colonne de clé primaire a déjà des valeurs.
Comme le dit l'erreur ...
ALTER TABLE provoque la resequencing auto_increment, résultant en une entrée en double '1' pour la clé 'PRIMARY'
ce qui signifie que votre colonne a déjà une valeur de clé primaire 1 qui lorsque vous incrémentez automatiquement cette colonne est réaffectée, ce qui provoque une duplication et donc cette erreur
la solution consiste à supprimer la contrainte principale, puis à vider la colonne. Ensuite, modifiez à nouveau le tableau définissant la clé primaire, cette fois avec incrémentation automatique.
Si la table est relativement nouvelle avec seulement quelques enregistrements, vous pouvez tronquer la table pour réinitialiser les valeurs d'ID:
TRUNCATE TABLE tablename;
Utiliser Supprimer ne réinitialise pas les valeurs d'ID.
DELETE FROM tablename;
une fois la table vidée, vous pouvez appliquer l'auto-incrémentation.
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
Cette erreur se produira également si vous disposez d'une table MyISAM contenant un _ AUTO_INCREMENT
PRIMARY KEY
et essaient de combiner les touches
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`);