Na przykład, oto tabela, która ma klucz podstawowy, ale nie jest AUTO_INCREMENT
:
mysql> CREATE TABLE foo (
id INT NOT NULL,
PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
Możesz MODIFY
kolumnę, aby przedefiniować ją za pomocą AUTO_INCREMENT
opcja:
mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
Sprawdź, czy to odniosło skutek:
mysql> SHOW CREATE TABLE foo;
Wyjścia:
CREATE TABLE foo (
`id` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
Zauważ, że zmodyfikowałeś definicję kolumny na miejscu, bez konieczności tworzenia drugiej kolumny i upuszczania oryginalnej kolumny. PRIMARY KEY
ograniczenie jest nienaruszone i nie musisz wspominać w ALTER TABLE
oświadczenie.
Następnie możesz sprawdzić, czy wstawka generuje nową wartość:
mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;
Wyjścia:
+----+
| id |
+----+
| 1 |
| 2 |
| 5 |
| 6 |
+----+
4 rows in set (0.00 sec)
Przetestowałem to na MySQL 5.0.51 na Mac OS X.
Testowałem również z ENGINE=InnoDB
oraz tabela zależna. Modyfikowanie id
definicja kolumny nie zakłóca integralności referencyjnej.
Aby odpowiedzieć na błąd 150, o którym wspomniałeś w swoim komentarzu, prawdopodobnie jest to konflikt z ograniczeniami klucza obcego. Przepraszam, po przetestowaniu pomyślałem, że to zadziała. Oto kilka linków, które mogą pomóc w zdiagnozowaniu problemu:
- Co oznacza błąd mysql 1025 (HY000):Błąd zmiany nazwy './foo' (błąd nr:150)?
- http://www.simplicidade.org/notes/ archiwa/2008/03/mysql_errno_150.html