MySql can't make column auto_increment
Asked Answered
J

10

74

I have a table "Bestelling" with 4 columns: "Id" (PK), "KlantId", "Datum", "BestellingsTypeId", now I want to make the column Id auto_increment, however, when I try to do that, I get this error:

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

Anyone got an idea?

Jospeh answered 23/3, 2011 at 9:12 Comment(1)
I was experiencing the same issue. I just updated the value of zero to something bigger INT, enabled AUTO_INCREMENT while there's no zero value. Then I put it back to zero. Now that column has both AUTO_INCREMENT and zero. I'm going to see if this works.Caliche
C
183

This will happen if the table contains an existing record with an id of 0 (or negative). Updating all existing records to use positive values will allow auto_increment to be set on that column.

Edit: Some people asked how that 0 got in there. For clarification, the MySQL Reference Manual states that "For numeric types, the default is 0, with the exception that for integer or floating-point types declared with the AUTO_INCREMENT attribute, the default is the next value in the sequence." So, if you performed an insert on a table without providing a value for the numeric column before the auto_increment was enabled, then the default 0 would be used during the insert. More details may be found at https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html.

Chaucerian answered 24/6, 2011 at 14:58 Comment(2)
and afterwards you can change the id back to 0 if you wantUnprovided
I don't recommend that- I suspect it would cause issues again laterChaucerian
A
53

I also had this issue when trying to convert a column to auto_increment where one row had a value of 0. An alternative to changing the 0 value temporarily is via setting:

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

for the session.

This allowed the column to be altered to auto_increment with the zero id in place.

The zero isn't ideal - and I also wouldn't recommend it being used in an auto_increment column. Unfortunately it's part of an inherited data set so I'm stuck with it for now.

Best to clear the setting (and any others) afterwards with:

SET SESSION sql_mode='';

although it will be cleared when the current client session clsoes.

Full details on the 'NO_AUTO_VALUE_ON_ZERO' setting here.

Adapt answered 28/2, 2012 at 15:37 Comment(2)
From my point of view this is the most smooth approach for already existing data containing zeros in PK columns. I appreciate it very much, saved lot of my time!Tytybald
I too had a legacy dataset with an ID of 0. For those cases, and I suspect the person asking the question had the same use case, then this is the correct answer.Samalla
B
34

This happens when MySQL can not determine a proper auto_increment value. In your case, MySQL choose 1 as next auto_increment value, however there is already row with that value in the table.

One way to resolve the issue is to choose a proper auto_increment value yourself:

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

(Note the AUTO_INCREMENT=123456 at the end.)

Burkley answered 11/12, 2014 at 10:7 Comment(2)
Exactly what I needed. I can't believe this answer isn't higher in the list.Conscript
In order to determine the next auto_increment value, you can use: SELECT MAX( Id ) + 1 FROM table_nameZales
G
14

The easiest way that I have found to solve this issue is to first set the table's AUTO INCREMENT value before altering the column. Just make sure that you set the auto increment value higher than the largest value currently in that column:

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

I tested this on MySQL 5.7 and it worked great for me.

Generalization answered 24/4, 2016 at 21:6 Comment(1)
This should be selected as the correct answer, not the method of recreating table!Doubletongue
W
13

Edit: Don't know exactly how that would be caused, but I do have a workaround.

First, create a new table like the old one:

CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;

Then change the column

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

Dump in the new data:

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

Move the tables:

RENAME TABLE 
aafest_bestelling TO aafest_bestelling_old, 
aafest_bestelling_new TO aafest_bestelling;

Maybe there's some corruption going on, and this would fix that as well.

P.S.: As a dutchman, I'd highly recommend coding in english ;)

Warrenne answered 23/3, 2011 at 9:14 Comment(5)
ye, but the column is already PK, so all values should be unique, right?Jospeh
Have a look.. I had my MySQL tables more than once in a state where uniqueness constraints were violated. SELECT Id, COUNT(*) as count From aafest_bestelling GROUP BY Id HAVING count > 1;Warrenne
and loose all integrity, yesOstiary
-1 this should not be the accepted answer. This error happens when you have a record with an id of 0. If you get rid of that record with id 0, the auto_increment can then be added without error. That's the solution. This accepted answer here is more complicated and error prone, can cause data integrity problems between tables, and will lead to longer down time. Just remove the record with id 0 and run your alter table statement again.Ofris
@Ofris - as I came back to this page again today, and saw your comment, I decided to change the accepted answer. Thanks for the feedback!Jospeh
S
7

I had a similar issue. Issue was the table had a record with ID = 0 similar to what SystemParadox pointed out. I handled my issue by the following steps:

Steps:

  1. Update record id 0 to be x where x = MAX(id)+1
  2. Alter table to set primary key and auto increment setting
  3. Set seed value to be x+1
  4. Change record id x back to 0

Code Example:

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;
Sharpedged answered 10/4, 2018 at 21:54 Comment(0)
M
4

This error comes because the any table contains an existing record with an id of 0 (or negative). Update all existing records to use positive values will allow auto_increment to be set on that column. If this didn't work then export all the data and save it any where in you computer and dont first make foreign key relation then fill data in parent table .

Montmartre answered 11/9, 2020 at 10:7 Comment(1)
Yes. If the table already contains rows when you alter the column 'id' to be auto increment, then you might want to set the initial auto increment seed to the next available value: ALTER TABLE aafest.aafest_bestelling CHANGE COLUMN Id Id INT(11) NOT NULL AUTO_INCREMENT = 1000; Best of luck!Withal
T
2

This happens because your primary key column already has values.

As the error says ...

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

which means that your column already has a primary key value 1 which when you auto_increment that column is reassigned causing duplication and hence this error

the solution to this is to remove the primary constraint and then empty the column. Then alter the table setting the primary key again, this time with auto increment.

Thibaut answered 3/4, 2014 at 12:14 Comment(1)
Good Idea to get rid of the column and recreate it especially when you have errors.Electro
E
0

This error will also happen if have a MyISAM table that has a composite AUTO_INCREMENT PRIMARY KEY and are trying to combine the keys

For example

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`);
Elijah answered 10/3, 2014 at 9:47 Comment(0)
M
0

Not being able to set an existing column to auto_increment also happens if the column you're trying to modify is included in a foreign key relation in another table (although it won't produce the error message referred to in the question).

(I'm adding this answer even though it doesn't relate to the specific error message in the body of the question because this is the first result that shows up on Google when searching for issues relating to not being able to set an existing MySQL column to auto_increment.)

Mccollough answered 25/7, 2022 at 7:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.