如何在MySQL表中添加主键?


103

这是我尝试过的但失败了:

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

有人给小费吗?


11
当某件事失败时,总是最好指定失败的含义:您是否收到错误消息?哪一个 ?
Pascal MARTIN

我猜错误消息看起来像:定义了多个主键
LMD

Answers:


226

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

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个了。
LMD

2
我肯定会放在FIRST之后AUTO_INCREMENT,这意味着,id它将是已经存在的表的第一列。否则,它将如现在编写的那样放在表的末尾,这在进行简单操作时可能会有点混乱SELECT * ...
StefanK

如何在新的“ id”列中获得第一名
TipVisor

17

现有栏

如果要将主键约束添加到现有列,则所有前面列出的语法都会失败。

要将主键约束添加到现有列,请使用以下格式:

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

1
mysql无法将MODIFY识别为正确的语句(至少在XAMPP,InnoDB中有效)
LMD

@LMD您正在使用哪个版本的mysql?(注意:我知道在我发布此信息时它是有效的,我相信它是5.6 ...但我不敢肯定)
MER

1
如果像我一样对您来说,它不起作用,请用CHANGE代替MODIFY,它将起作用!
csr-nontol

12

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

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

因为它会在临时表中复制所有数据,所以先更改表,然后再将其复制回去。最好手动进行。重命名表格:

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;

将PK添加到具有约2亿行的表需要2,000秒。


我很惊讶需要搜索多长时间才能找到此答案。感谢您提供这些有用的示例。
Ryan

4

不知道这对其他人是否有影响,但是我更喜欢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;

高度,-英尺





0

试试这个,

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

0

对我来说,没有任何建议可以给我带来语法错误,因此我只是尝试使用phpmyadmin(版本4.9.2),(10.4.10-MariaDB)并添加了id具有自动递增主键的列。Id列是从第一个元素很好地添加的。

查询输出为:

ALTER TABLE table_nameADD idINT NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY(id);


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.