MySQL 기본 키 업데이트


103

나는 테이블이있다 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 (테이블의 열)을 .

그런 다음 어떻게 든 기본 키를 다시 업데이트하십시오.


16
갑자기 숨을 쉬며 저주 한 모든 DBA에 대해 갑자기 기분이 나빠졌습니다 ...
Ignacio Vazquez-Abrams

5
다음에 기본 키와 동일한 열이있는 고유 키를 추가 한 다음 기본 키를 업데이트합니다.
knittl

1
@Ignacio, 서버에 라이브이지만 백업 백업 서버입니다 :-). 저는 DBA는 아니지만 정말 라이브 서버에서이 작업을 시도하지
않겠습니다.

1
내가 지금 무슨 생각을 @knittl, 그래 그의, 매우 늦게하지만 :-)
simplfuzz

4
@pixeline : 복합 기본 키입니다.
Ignacio Vazquez-Abrams

답변:


231

다음 번에는 단일 "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;

잠금은이 작업을 수행하는 동안 들어오는 추가 업데이트를 중지해야합니다. 이 작업에 걸리는 시간은 테이블 크기에 따라 다릅니다.

주요 문제는 동일한 타임 스탬프를 가진 일부 중복 항목이있는 경우입니다.


11

기본 키가 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;

2

IGNORE키워드도 사용할 수 있습니다 . 예 :

 update IGNORE table set primary_field = 'value'...............
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.