두 개의 테이블 pattern
및 pattern_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
될하는 데 사용되는 모든 값 대신 (새 테이블에 0
될 NULL
인데, 이는 트리거에 구현 된 것과 별도로 행의 기본값이기도합니다. MySQL은 트리거 이전에 값을 변환하는 것처럼 보입니다.
임시 테이블을 사용하여이 문제를 해결할 수 있음을 알고 있지만 차라리 그렇게하지 않을 것입니다. pattern
테이블은 불쾌하게 커다. 나는 그것을 위해 저장 프로 시저를하고 싶지 않다.
다른 방법이 있습니까, 아니면 몇 가지 간단한 점을 놓치고 있습니까?
EDIT : 원래 테이블에 SIGNED 문제가있는 매우 많은 열이 있으므로 다소 자동화하려고합니다.
재미 있고, 나는 그것에 대해 몰랐습니다! 내가 INSERT ... SELECT *를하고 싶다면이 "SIGNED"필드가 상당히 많아서 전체 삽입 정의를 조정할 수 있기를 바랍니다. – sunside
새 테이블 필드의 기본값을 들어오는 데이터의 범위가 아닌 값으로 설정 한 다음 삽입을 실행할 수 있다고 가정합니다. 경고가 표시되고 -1이이 새로운 기본값으로 변환됩니다. 그런 다음 해당 값을 널 (null)로 설정하도록 테이블을 갱신 한 다음 새 테이블 컬럼의 디폴트 값을 다시 널 (null)로 변경합니다. 하지만 그것은 임시 테이블이나 인라인 조건부로 데이터를 변환하는 것보다 더 많은 작업처럼 보입니다. 또한 사용자가 실제로 사용하는 "임시 기본값"이 들어오는 데이터의 범위에 있지 않다는 것을 확신해야합니다. –
IF() 버전 및보기가 나타납니다. 감사! – sunside