将MySQL列更改为自动增量

238

我试图修改一张表,在创建后将其主键列设置为 AUTO_INCREMENT。 我尝试了以下SQL,但是收到了语法错误通知。

ALTER TABLE document
ALTER COLUMN document_id AUTO_INCREMENT

我是在做错什么,还是这不可能实现?

+--------------------+
| VERSION()          |
+--------------------+
| 5.0.75-0ubuntu10.2 |
+--------------------+
21个回答

457
ALTER TABLE document MODIFY COLUMN document_id INT auto_increment

3
我好奇为什么你建议使用INT(4),有特别的原因吗? - Steven Oxley
3
因为我以那种方式声明了我的表格。 - C. Ross
34
在MySQL整数类型中,在括号内指定数字几乎没有任何作用(好吧,几乎没有)。唯一可能受数字影响的是显示宽度,但这取决于客户端。但不要被欺骗以为它像VARCHAR和DECIMAL类型那样工作-在这些情况下,您实际上可以指定可以存储的数据量,而特定类型的INT始终允许存储完全相同范围的值。 - Roland Bouman
我在执行这些操作时总是会遇到主键错误,所以我会这样做:SET FOREIGN_KEY_CHECKS = 0; ALTER TABLE document DROP PRIMARY KEY; ALTER TABLE document MODIFY COLUMN document_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL; SET FOREIGN_KEY_CHECKS = 1; - Fernando
这在MySQL中似乎不起作用,因为您需要将该列设置为主键,因为只允许一个列是自动增量(也请参见下面Roland Bouman的答案)。 - charlchad

91

Roman是正确的,但请注意auto_increment列必须是PRIMARY KEY或UNIQUE KEY的一部分(在几乎100%的情况下,它应该是构成PRIMARY KEY的唯一列):

ALTER TABLE document MODIFY document_id INT AUTO_INCREMENT PRIMARY KEY

12
如果在创建表时未定义主键,则需要主键。 - user966588
1
同时,这意味着该列中的数据需要已经是唯一的。 - Umair Malhi

13

在我的情况下,只有在我加入not null时它才起作用。我认为这是一个约束。

ALTER TABLE document MODIFY COLUMN document_id INT NOT NULL AUTO_INCREMENT;

12

您可以通过以下查询将auto_increment约束应用于数据列:

ALTER TABLE customers MODIFY COLUMN customer_id BIGINT NOT NULL AUTO_INCREMENT;

但是,如果这些列是外键约束的一部分,那么您很可能会收到错误提示。因此,建议使用以下查询关闭 foreign_key_checks:

SET foreign_key_checks = 0;

因此,请改用以下查询:
SET foreign_key_checks = 0;
ALTER TABLE customers MODIFY COLUMN customer_id BIGINT NOT NULL AUTO_INCREMENT;
SET foreign_key_checks = 1;

这应该是被接受的答案。在现实生活中,PK很有可能是FK约束的一部分。 - E-Riz

8
这可以使用以下SQL实现:
ALTER TABLE `document` MODIFY COLUMN `document_id` INT AUTO_INCREMENT;

你的SQL可能无法正常工作有几个原因。首先,你必须重新指定数据类型(在本例中为INT)。此外,你尝试更改的列必须被索引(它不一定是主键,但通常这是你想要的)。此外,每个表只能有一个AUTO_INCREMENT列。因此,如果你的列没有被索引,你可能希望运行以下SQL:

ALTER TABLE `document` MODIFY `document_id` INT AUTO_INCREMENT PRIMARY KEY;

您可以在MySQL文档中找到更多信息:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html,其中包括修改列语法,以及http://dev.mysql.com/doc/refman/5.1/en/create-table.html,其中包括有关指定列的更多信息。

8

在使用auto_increment指令之前,您必须指定列的类型,例如:ALTER TABLE document MODIFY COLUMN document_id INT AUTO_INCREMENT


1
应该是 MODIFY COLUMN - shxfee

7

AUTO_INCREMENT是列数据类型的一部分,您需要重新定义列的完整数据类型:

ALTER TABLE document
ALTER COLUMN document_id int AUTO_INCREMENT

(以“int”为例,您应该将其设置为列之前的类型)

6
你可以这样做:
 alter table [table_name] modify column [column_name] [column_type] AUTO_INCREMENT;

这似乎只是其他所有答案的重复。 - Pang

5
你可以使用以下查询来使 document_id 自动增加。
ALTER TABLE document MODIFY COLUMN document_id INT auto_increment

最好也将document_id设为主键

ALTER TABLE document MODIFY COLUMN document_id INT auto_increment PRIMARY KEY;

1
请注意,如果该列已经是主键,则无法在此处再次声明它,否则会出现关于多个主键的错误(您可能希望它在这方面更聪明一些,并且看到它是相同的主键)。因此,在这种情况下,您只需跳过PRIMARY KEY即可,它不会影响该列上现有的主键设置。 - George Birbilis

5
以下语句可行。请注意,您需要再次为列名提及数据类型(重新声明列之前的数据类型)。
ALTER TABLE document
MODIFY COLUMN document_id int AUTO_INCREMENT;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接