更新MySQL主键
我有一个表user_interactions
与4列:
user_1 user_2 type timestamp
主键是(user_1,user_2,type)
我想改成(user_2,user_1,type)
所以我做的是:
drop primary key ... add primary key (user_2,user_1,type)...
呃…
问题在于数据库是在服务器上运行的。
所以在我更新主键之前,许多重复的东西已经悄悄进入,他们不断地爬进去。
该怎么办?
我现在想要做的是删除重复,并保留最新的timestamp
(这是表中的一列)。
然后以某种方式再次更新主键。
下一次,使用一个“alter table”语句来更新主键。
alter table xx drop primary key, add primary key(k1, k2, k3);
修正事情:
create table fixit (user_2, user_1, type, timestamp, n, primary key( user_2, user_1, type) ); lock table fixit write, user_interactions u write, user_interactions write; insert into fixit select user_2, user_1, type, max(timestamp), count(*) n from user_interactions u group by user_2, user_1, type having n > 1; delete u from user_interactions u, fixit where fixit.user_2 = u.user_2 and fixit.user_1 = u.user_1 and fixit.type = u.type and fixit.timestamp != u.timestamp; alter table user_interactions add primary key (user_2, user_1, type ); unlock tables;
当你正在做这件事时,锁应该停止进一步的更新。 这需要多长时间取决于你的表的大小。
主要的问题是如果你有一些相同的时间戳重复。
您也可以使用IGNORE
关键字,例如:
update IGNORE table set primary_field = 'value'...............
如果主键恰好是auto_increment值,则必须删除自动增量,然后删除主键,然后重新添加自动增量
ALTER TABLE `xx` MODIFY `auto_increment_field` INT, DROP PRIMARY KEY, ADD PRIMARY KEY (new_primary_key);
然后加回自动增量
ALTER TABLE `xx` ADD INDEX `auto_increment_field` (auto_increment_field), MODIFY `auto_increment_field` int auto_increment;
然后将自动增量设置回先前的值
ALTER TABLE `xx` AUTO_INCREMENT = 5;