2014-01-07 4 views
1

배경 - 단일 대형 플랫 파일로 작성된 DB가 있습니다. 106 개의 열이있는 하나의 큰 테이블을 만드는 대신. 필자는 컬럼 이름과 그 데이터를 보유하고있는 테이블의 id와 각 컬럼에 대한 데이터를 저장하는 106 개의 다른 테이블을 저장하는 "columns"테이블을 만들었습니다. 모든 레코드가 모든 열에 데이터를 가지고있는 것은 아니기 때문에 데이터를로드하는 데 더 효율적인 방법이라고 생각했습니다 (나쁜 생각 일 수도 있음).MySQL 임시 테이블이 지워지지 않습니다.

이 문제는이 구조에서 단일 레코드를 다시 작성하는 데 어려움이 있습니다.

DROP PROCEDURE IF EXISTS `col_val`; 
delimiter $$ 

CREATE PROCEDURE `col_val`(IN id INT) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS tmp_record; 
    CREATE TEMPORARY TABLE tmp_record (id INT(11), val varchar(100)) ENGINE=MEMORY; 
    SET @ctr = 1; 
    SET @valsql = ''; 
    WHILE (@ctr < 107) DO 
     SET @valsql = CONCAT('INSERT INTO tmp_record SELECT ',@ctr,', value FROM col',@ctr,' WHERE recordID = ',@id,';'); 
     PREPARE s1 FROM @valsql; 
     EXECUTE s1; 
     DEALLOCATE PREPARE s1; 
     SET @ctr = @ctr+1; 
     END WHILE; 
END$$ 
DELIMITER ; 

그럼 내가 저장 프로 시저 매개 변수 내가 원하는 레코드의 ID입니다 다음 SQL을 사용하여이를 용이하게하기 위해 나는 다음과 같은 절차를 만들었습니다.

CALL col_val(10); 
SELECT c.`name`, t.`val` 
FROM `columns` c INNER JOIN tmp_record t ON c.ID = t.id 

문제점 -이 프로그램을 처음 실행할 때 훌륭합니다. 그러나 매개 변수가 변경 되더라도 이후의 각 실행은 똑같은 레코드를 반환합니다. 저장 프로 시저가 임시 테이블을 삭제하고 다시 작성해야 할 때도 어떻게 유지됩니까?

전체 설계를 다시 생각해보고 단일 테이블로 돌아갈 수도 있지만 문제는 내가 이해하고 싶은 것을 보여줍니다.

확실하지 않다면 Windows 7에서 MySQL 5.6 (64 비트)을 실행하고 MySQL Workbench v5.2.47 CE를 통해 SQL을 실행합니다. MySQL의 저장 프로 시저, 로컬 변수 앞에서 @ 심볼을 두지 않는

답변

0

감사 (로컬 입력 파라미터 또는 변수 선언). @iduser variable을 나타내며 프로 시저를 호출하는 세션의 전역 변수와 비슷합니다.

즉, @idid과 다른 변수입니다.

즉각적인 문제에 대한 설명입니다. 그러나, 나는 당신이 한 것처럼 테이블을 디자인하지 않을 것입니다.

모든 레코드가 모든 열 데이터를 가지고 있기 때문에

는,이 데이터 I는 기존의 단일 테이블을 사용하는 것이 좋습니다

를로드하는보다 효율적인 방법이 될, 누락 의미하는 NULL을 사용할 수 있습니다 생각 데이터.

+0

감사합니다. 확실히 원래 디자인을 다시 작업해야합니다. 처음 엔 질의가 작동한다는 것이 이상하다. 아마 당신이 메모리에 머무르면서 설명했던 것처럼 변수를 가진 어떤 이상한 생각 일 겁니다. – NoNV

+0

예, 사용자 변수는 세션 기간 동안 해당 값을 유지합니다. –