2013-08-26 3 views
1

임시 테이블을 생성하여 실제 테이블을 일시적으로 섀도우하고 실제 테이블과 동일한 이름과 구조를 갖기를 원합니다.일반 테이블과 같은 임시 테이블 만들기

독립적으로 모든 기능이 예상대로 작동합니다.

CREATE TEMPORARY TABLE t2 LIKE t; 
:

CREATE TEMPORARY TABLE t (test INT); 

이 원본과 동일한 구조의 임시 테이블 (그러나 다른 이름)을 만들어이 임시 하나가 다시 삭제 될 때까지 위의 표를 숨 깁니다 임시 테이블을 생성

그러나 이것은 오류가 있습니다 :

CREATE TEMPORARY TABLE t LIKE t; 

1066 - Not unique table/alias: 't'

표는 지속적인 CACH 인을 e는 원본 테이블에서 가져올 때 너무 오래 걸리는 그룹화 된 데이터를 보유합니다. 이 데이터는 보고서를 생성하는 데 사용됩니다. 때때로 부분 보고서의 경우 데이터의 하위 집합에서 캐시를 새로 만들고 싶습니다. 임시 테이블은 원래의 캐시를 새로운 데이터로 덮어 씌울 수 있고, 보고서 기능을 실행하며, 연결이 끝나면 자동으로 삭제 될 수 있기 때문에 임시 테이블이 이상적입니다. 다른 모든 프로세스는 실제로 영구 테이블을 사용할 수 있습니다.

+0

당신에게 내 잘못을 무엇 n "일시적으로 실제 테이블을 그늘지게하십시오"? –

+0

내가 말했듯이 : 임시 테이블을 다시 떨어 뜨릴 때까지 이전 테이블을 숨 깁니다. – AndreKR

+0

향상된 답변 @AndreKR –

답변

4

지금 당신이 뭘 하려는지 이해, 이것은 당신이 원하는 것을 내가하는 일에 올 수있는 가장 가까운 :

CREATE TEMPORARY TABLE t AS SELECT * FROM t LIMIT 0; 

이것은 임시 테이블을 작성하는 것 '그림자'원래 거의은 동일한 스키마입니다. 전반적으로 수행하지 않는 핵심 사항은 키 정의, 키, 인덱스 및 기본값에 대한 auto_increment 속성입니다.


원래 대답 : 당신은 당신의 일을하는 동안 당신은 테이블의 이름을 바꿀 수 있습니다.이해 스크립트가 실행되는 동안이 버전에서, 당신의 그림자 테이블이 다른 모든 연결을 볼 수 있다고 생각 :

CREATE TABLE target_temp LIKE target; 

을 그리고 원자 두 테이블의 이름을 변경, 그래서 "일시적으로"표는 진짜 대체

RENAME TABLE target TO target_old, target_temp TO target; 

당신의 일을 할 ... 그런

는 취소 :

RENAME TABLE target TO target_temp, target_old TO target; 
DROP TABLE target_temp; 
+0

질문에 대한 설명을 추가했습니다. – AndreKR

0

나는 당신이하고 싶은 것을 완전히 이해하지 못합니다. 그러나 내가 만들고 다른 이름 바꾸기 다음 이름 바꾸기를 할 수 있다고 생각하고 :

rename table t to t_hide; 

create table t like t_hide; 

. . . 

drop table t; 

rename table t_hide t; 

나는이 작업을 수행 할 수있는 기본 방법이라고 생각하지 않습니다. 거래를 열 수 있습니다. t을 변경 한 다음 트랜잭션을 롤백하여 변경 사항이 적용되지 않도록하십시오. 그것은 또한 당신이 원하는 것일 수도 있습니다.

편집 :

대안 솔루션 t라는보기에 원래의 테이블을 설정하는 것입니다. 그래서, 한 번 당신이 할 것 :

rename table t to t_real; 

create view t as select * from t_real; 

은 그럼 당신은 같은 작업을 수행 할 수 있습니다

create table t_fake like t_real; 

alter view t as select * from t_fake; 

alter view이 것이다 (그것은 어떤 다른 트랜잭션에 영향을주지 않습니다 있다는 의미에서 "순간"해야한다 명확하게 정의 된 "전"과 "후").

+0

테이블은 MyISAM입니다. 나는'CREATE TEMPORARY TABLE t2 LIKE t;를 시도했다. 이름 바꾸기 표 t2 ~ t; '하지만'표 '가 이미 있습니다'라고 알려줍니다. 원래 테이블의 이름을 변경하면 임시 테이블이 생성 될 때까지't'에 액세스하는 모든 쿼리가 중단됩니다. – AndreKR

+0

@AndreKR. . . 기존 테이블의 이름을 바꾸는 것은 매우 빠른 작업이어야합니다. 나는 당신이 또한 (비록 내가 이름을 바꿀 때 테이블을 잠그지 않았지만) 일어나고있는 동안 테이블을 잠글 수 있다고 생각한다. –

+0

잠금이 이름 변경을 "따르지"않습니까? 마치 t를 잠근 다음'RENAME TABLE t TO t2'처럼, t2는 잠겨져 있고 "t라고 불리는 미래의 테이블"이 아니라고 생각합니다. – AndreKR

관련 문제