반응형
MySQL 기본 키 업데이트
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'...............
참고 URL : https://stackoverflow.com/questions/2341576/updating-mysql-primary-key
반응형
'Programing' 카테고리의 다른 글
MVC 5 시드 사용자 및 역할 (0) | 2020.09.05 |
---|---|
Android-시작시 흰색 화면 방지 (0) | 2020.09.05 |
점을 구분 기호로 사용하여 문자열 분할 (0) | 2020.09.05 |
Mac OS에서 Maven의 settings.xml은 어디에 있습니까? (0) | 2020.09.05 |
-D_XOPEN_SOURCE의 기능 / 의미는 무엇입니까? (0) | 2020.09.04 |