更新 MySQL 主键

我有一个4列的 user_interactions表:

 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(表中的一列)的内容。

然后以某种方式再次更新主键。

227612 次浏览

你也可以使用 IGNORE关键字,例如:

 update IGNORE table set primary_field = 'value'...............

下次,使用单个“ 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;

在您执行此操作时,锁应该会阻止进一步的更新。显然,这需要多长时间取决于表的大小。

主要问题是,如果您有一些具有相同时间戳的副本。

如果主键恰好是 auto _  增量值,您必須移除自動增量,然後放下主键,然後重新加入自動增量

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;