2つのテーブルがpattern
ありpattern_optimized
ます。テーブル内の一部のフィールドはpattern
として定義されていますがBIGINT(20) DEFAULT '-1'
、これは保持するデータには大きすぎます。さらに、-1
「未設定」として使用されます(ゼロは有効な値です)。それ以外の場合、他の負の値は使用されません。
テーブルはこれらの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
ためだけにストアドプロシージャを実行したくありません。
他の方法はありますか、それとも簡単なポイントが欠けていますか?
編集:元のテーブルにはSIGNEDの問題に悩まされている列がかなりたくさんあるので、それをいくらか自動化したいと思っていました。