1. ホーム
  2. mysql

[解決済み] MySQLのプライマリーキーを更新する

2022-03-10 08:58:08

質問

私はテーブルを持っています 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 (これはテーブルのカラムです)。

そして、何らかの方法で再び主キーを更新します。

解決方法は?

次回は、1つの "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;

この作業を行っている間、ロックはさらなる更新を停止させるはずです。 この作業にどれくらい時間がかかるかは、明らかにテーブルのサイズに依存します。

主な問題は、同じタイムスタンプを持つ重複がある場合です。