如何向MySQL表添加主键?

134

我尝试了以下方法,但它失败了:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

有人有提示吗?


13
当某些事情“失败”时,最好明确指出“失败”的意思:是否收到错误消息?是哪一个? - Pascal MARTIN
我猜错误信息看起来像:定义了多个主键。 - Luatic
只是一个笔误:主 - Gert Arnold
12个回答

279

添加完列之后,您始终可以添加主键:

ALTER TABLE goods ADD PRIMARY KEY(id)

至于为什么您的脚本无法工作,是因为您需要指定 PRIMARY KEY,而不仅仅是单词 PRIMARY

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

对我来说,这意味着定义了多个主键。我正在使用InnoDB。请注意,我已经有3个主键。 - Luatic
3
我肯定会在AUTO_INCREMENT之后放置FIRST,这意味着id将成为已存在表格的第一列。否则,它将按照现在的写法放置在表格末尾,当进行简单的SELECT * ...操作时可能会有些混乱。 - StefanK
如何在新的“id”列中获取第一个位置 - TipVisor
我认为你不需要在int周围加上(10)。并且在末尾添加FIRST,这样主键就是表中的第一列。 - rjh

29

现有列

如果您想要在现有列上添加主键约束,之前列出的所有语法都将失败。

要在现有列上添加主键约束,请使用以下形式:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

2
MySQL在XAMPP中的InnoDB引擎中无法识别MODIFY语句。 - Luatic
@LMD 你使用的是哪个版本的mysql?(注意:我知道在我发布这篇文章时它可以工作,我相信那时是5.6...但我不能确定) - MER
1
如果对你来说,就像对我一样,它不起作用,请将 MODIFY 替换为 CHANGE,它就会起作用! - csr-nontol

16
如果您的表很大,最好不要使用以下语句:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

因为它会在一个临时表里复制所有的数据,再进行 alter table 操作,并将数据拷贝回去。 最好手动操作。 重命名你的表:

rename table goods to goods_old;

创建具有主键和所有必要索引的新表:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

将旧表中的所有数据移动到新表中,禁用键和索引以加快复制速度:

-- 对于 MyISAM 表,请使用以下命令:

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

-- 对于InnoDB表,请使用此选项:

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

在大约2亿行的表中添加PK需要2000秒。


12

我不确定这对其他人是否有影响,但我更喜欢将表格的id作为数据库中的第一列。语法如下:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

这只是比第一个答案稍微改进了一点。如果您希望它在不同的位置,那么

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

你好,HTH,-ft


6
使用这个查询:
alter table `table_name` add primary key(`column_name`);

2
这段代码可以在我的MySQL数据库中运行:
ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);

2
对我而言,所有的建议都没有起作用,因为出现了语法错误,所以我尝试使用phpmyadmin(版本4.9.2)和(10.4.10-MariaDB),并添加了一个带有自动增量主键的id列。从第一个元素开始,id列被成功添加。
查询输出如下:
ALTER TABLE table_name ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);

1
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;

1
如果之前您已经有一个或多个主键,且想将更多列作为主键,您需要在语句中添加DROP PRIMARY KEY并在ADD PRIMARY KEY部分重新提及旧的键和新的键。请看以下示例。
my_test_table为例,之前该表只有一个名为old_key的主键列,然后我们新增了一个名为new_key的列。
ALTER TABLE my_test_table ADD COLUMN new_key INT; -- Or whatever data type you need

如果我们想要将表格设置主键为{old_key, new_key},则可以使用以下语句:
ALTER TABLE my_test_table
DROP PRIMARY KEY, -- You have to add this
ADD PRIMARY KEY(
    old_key,      -- Re-mention the old key
    new_key       -- And mention also the new one
);

0

试试这个,

alter table goods add column `id` int(10) unsigned primary key auto_increment

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