Till exempel, här är en tabell som har en primärnyckel men inte är AUTO_INCREMENT
:
mysql> CREATE TABLE foo (
id INT NOT NULL,
PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
Du kan MODIFY
kolumnen för att omdefiniera den med AUTO_INCREMENT
alternativ:
mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
Kontrollera att detta har trätt i kraft:
mysql> SHOW CREATE TABLE foo;
Utgångar:
CREATE TABLE foo (
`id` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
Observera att du har ändrat kolumndefinitionen på plats, utan att behöva skapa en andra kolumn och ta bort den ursprungliga kolumnen. PRIMARY KEY
begränsningen är opåverkad och du behöver inte nämna i ALTER TABLE
uttalande.
Därefter kan du testa att en infogning genererar ett nytt värde:
mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;
Utgångar:
+----+
| id |
+----+
| 1 |
| 2 |
| 5 |
| 6 |
+----+
4 rows in set (0.00 sec)
Jag testade detta på MySQL 5.0.51 på Mac OS X.
Jag testade även med ENGINE=InnoDB
och en beroende tabell. Ändra id
kolumndefinitionen avbryter inte referensintegriteten.
För att svara på felet 150 som du nämnde i din kommentar, är det förmodligen en konflikt med de främmande nyckelbegränsningarna. Jag ber om ursäkt, efter att jag testat det trodde jag att det skulle fungera. Här är ett par länkar som kan hjälpa dig att diagnostisera problemet:
- Vad betyder mysql-fel 1025 (HY000):Fel vid byte av './foo' (fel nr:150)?
- http://www.simplicidade.org/notes/ archives/2008/03/mysql_errno_150.html