Answers:
添加列之后,您始终可以添加主键:
ALTER TABLE goods ADD PRIMARY KEY(id)
至于为什么脚本不起作用,您需要指定PRIMARY KEY
,而不仅仅是单词PRIMARY
:
alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
FIRST
之后AUTO_INCREMENT
,这意味着,id
它将是已经存在的表的第一列。否则,它将如现在编写的那样放在表的末尾,这在进行简单操作时可能会有点混乱SELECT * ...
如果要将主键约束添加到现有列,则所有前面列出的语法都会失败。
要将主键约束添加到现有列,请使用以下格式:
ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
如果您的表很大,最好不要使用以下语句:
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秒。
不知道这对其他人是否有影响,但是我更喜欢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;
高度,-英尺
此代码在我的mysql数据库中有效:
ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
试试这个,
alter table goods add column `id` int(10) unsigned primary key auto_increment
删除引号即可正常使用...
alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;