更新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;