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
(テーブルの列)を持つものを保持することです。
そして、何らかの形で主キーを再度更新します。
次回は、単一の「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_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;
IGNORE
キーワードも使用できます。例:
update IGNORE table set primary_field = 'value'...............