如何将主键添加到MySQL表?

mys*_*_go 91 mysql

这是我尝试但它失败了:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)

有人有小费吗?

The*_*ter 206

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

ALTER TABLE goods ADD PRIMARY KEY(id)

至于你的脚本无法正常工作的原因,你需要指定的PRIMARY KEY不仅仅是单词PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)

  • 我肯定会在 `AUTO_INCREMENT` 之后放置 `FIRST`,这意味着 `id` 将是现有表的第一列。否则它会像现在写的那样放在表的末尾,这在做简单的`SELECT * ...`时可能会有点混乱 (3认同)

小智 12

如果您的表格更好,请不要使用以下语句:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)

因为它会复制临时表中的所有数据,alter table然后将其复制回来.最好手动完成.重命名你的桌子:

rename table goods to goods_old;
Run Code Online (Sandbox Code Playgroud)

使用主键和所有必需的索引创建新表:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);
Run Code Online (Sandbox Code Playgroud)

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

- 将其用于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;
Run Code Online (Sandbox Code Playgroud)

要么

- 使用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;
Run Code Online (Sandbox Code Playgroud)

将PK添加到具有约200万行的表中需要2 000秒.


MER*_*MER 12

现有专栏

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

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

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)

  • mysql 不将 MODIFY 识别为正确的语句(至少在 XAMPP、InnoDB 中) (2认同)

ftr*_*ter 8

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

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;
Run Code Online (Sandbox Code Playgroud)

与第一个答案相比,这只是一个小小的改进。如果你想让它处于不同的位置,那么

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;
Run Code Online (Sandbox Code Playgroud)

HTH,-ft


小智 7

使用此查询,

alter table `table_name` add primary key(`column_name`);
Run Code Online (Sandbox Code Playgroud)