MySQL에서 테이블을 어떻게 교환합니까?


51

foo매번 계산되는 통계가 들어 있는 table이 있다고 가정 해보십시오 . 다른 쿼리에서 많이 사용됩니다.

그렇기 때문에 최신 통계를 계산 foo_new하고 계산이 준비되면 스왑을 원합니다 .

나는 할 수있을 것이다

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

그러나 테이블 foo이 없을 때 쿼리가 두 줄 사이에 테이블이 필요한 경우 어떻게됩니까 foo? 어쨌든 잠그어야한다고 생각합니다 ... 또는 다른 방법이 있습니까?

답변:


79

이 하나의 명령을 사용하십시오.

RENAME TABLE foo TO foo_old, foo_new To foo;

원 자성 작업입니다. 두 테이블이 함께 잠기고 (매우 짧은 시간 동안) 액세스는 RENAME. 이전 또는 이후에 발생합니다 .



2
이것에 대한 한 가지 문제 tableX는 부모 제한 참조가있는 경우 foo입니다. 이 이름을 바꾼 후에는 foo_old참조 foo를 할 것이지만 참조하는 제약이 없다면 괜찮을 것입니다.
Marcin Wasiluk

@MarcinWasiluk-또 다른 단점 FOREIGN KEYs.
Rick James

2
또한 RENAME TABLE은 실행할 수있을 때까지 테이블의 기존 쿼리가 완료 될 때까지 기다려야합니다. 괜찮을 것이지만 RENAME이 발생하기를 기다리는 동안 다른 쿼리도 잠급니다! 이로 인해 데이터베이스 테이블이 심각하게 잠길 수 있습니다. 이것은 innodb에 적용됩니다!
John Hunt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.