나는 테이블이있다 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
(테이블의 열)을 .
그런 다음 어떻게 든 기본 키를 다시 업데이트하십시오.
답변
다음 번에는 단일 “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'...............