Programing

MySQL 기본 키 업데이트

crosscheck 2020. 9. 5. 08:47
반응형

MySQL 기본 키 업데이트


user_interactions4 개의 열 이있는 테이블 이 있습니다.

 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'...............

참고 URL : https://stackoverflow.com/questions/2341576/updating-mysql-primary-key

반응형