Lần tới, hãy sử dụng một câu lệnh "bảng thay thế" để cập nhật khóa chính.
alter table xx drop primary key, add primary key(k1, k2, k3);
Để khắc phục sự cố:
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;
Khóa sẽ ngừng cập nhật thêm trong khi bạn đang thực hiện việc này. Việc này mất bao lâu rõ ràng phụ thuộc vào kích thước bảng của bạn.
Vấn đề chính là nếu bạn có một số bản sao có cùng dấu thời gian.