2012-04-25 9 views
0

두 개의 테이블 patternpattern_optimized이 있습니다. pattern 테이블의 필드 중 일부는 BIGINT(20) DEFAULT '-1'으로 정의되며, 이는 보유한 데이터에 비해 너무 큽니다. 또한 -1은 "설정되지 않음"으로 사용됩니다 (0은 유효한 값 임). 다른 음수 값은 달리 사용되지 않습니다.MySQL : BEFORE INSERT 트리거에서 유형 변환 수행

pattern_optimized 테이블은 INT(10) UNSIGNED DEFAULT NULL으로 정의되는이 행에 대해 새로운 데이터 형식을 사용합니다. 이제 pattern에서 pattern_optimized 테이블로 데이터를 복사하고 싶습니다.

이 쉽게 INSERT INTO pattern_optimized SELECT * FROM pattern을 사용하여 수행 할 것이지만, 분명히 모든 음의 값이 같은 경고의 결과로, 이제 범위를 벗어난 다음과 같이

100 row(s) affected, 64 warning(s): 
1264 Out of range value for column 'version' at row 1 
1264 Out of range value for column 'triggered' at row 1 
... 
Records: 100 Duplicates: 0 Warnings: 357 

내 첫번째 생각은 BEFORE INSERT 트리거를 만드는 것이었다 :

CREATE TRIGGER `negativeValueFix` BEFORE INSERT ON `pattern_optimized` 
FOR EACH ROW 
BEGIN 
    IF new.version < 0 THEN 
     SET new.version = NULL; 
    END IF; 
    -- ... 
END 

하지만 불행히도이 도움이되지 않습니다 같은 경고가 나타나고 원래 테이블에 -1 될하는 데 사용되는 모든 값 대신 (새 테이블에 0NULL인데, 이는 트리거에 구현 된 것과 별도로 행의 기본값이기도합니다. MySQL은 트리거 이전에 값을 변환하는 것처럼 보입니다.

임시 테이블을 사용하여이 문제를 해결할 수 있음을 알고 있지만 차라리 그렇게하지 않을 것입니다. pattern 테이블은 불쾌하게 커다. 나는 그것을 위해 저장 프로 시저를하고 싶지 않다.

다른 방법이 있습니까, 아니면 몇 가지 간단한 점을 놓치고 있습니까?

EDIT : 원래 테이블에 SIGNED 문제가있는 매우 많은 열이 있으므로 다소 자동화하려고합니다.

답변

2

사례 명세서를 사용할 수 있습니까? 뭔가 같이 :

INSERT INTO pattern_optimized SELECT CASE version WHEN -1 THEN null ELSE version END CASE AS version FROM pattern

+0

재미 있고, 나는 그것에 대해 몰랐습니다! 내가 INSERT ... SELECT *를하고 싶다면이 "SIGNED"필드가 상당히 많아서 전체 삽입 정의를 조정할 수 있기를 바랍니다. – sunside

+0

새 테이블 필드의 기본값을 들어오는 데이터의 범위가 아닌 값으로 설정 한 다음 삽입을 실행할 수 있다고 가정합니다. 경고가 표시되고 -1이이 새로운 기본값으로 변환됩니다. 그런 다음 해당 값을 널 (null)로 설정하도록 테이블을 갱신 한 다음 새 테이블 컬럼의 디폴트 값을 다시 널 (null)로 변경합니다. 하지만 그것은 임시 테이블이나 인라인 조건부로 데이터를 변환하는 것보다 더 많은 작업처럼 보입니다. 또한 사용자가 실제로 사용하는 "임시 기본값"이 들어오는 데이터의 범위에 있지 않다는 것을 확신해야합니다. –

+0

IF() 버전 및보기가 나타납니다. 감사! – sunside

1

그냥 SELECT 문, 예를 들어, 작은 조건을 추가 -

INSERT INTO pattern_optimized(version) 
    SELECT IF(version < 0, NULL, version) version FROM pattern 

... 다른 입력란을 추가하십시오.

+0

@Raj와 동일합니다. 잘 모르겠지만, 모든 분야에서 그렇게하기를 기대하고있었습니다. (변경 중에 거기에 트리거를 사용하여 새 테이블에 복제하려는 오래된 테이블에 삽입이 생깁니다.) – sunside

+0

Rajs는 처음에 + 기본적으로 동일한 응답을 얻었으므로 Rajs 응답을 받아 들였습니다.그래도 당신의 대답을 upvoted. 고마워! – sunside

+0

@Markus - OK ;-) – Devart