0

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の問題に悩まされている列がかなりたくさんあるので、それをいくらか自動化したいと思っていました。

4

2 に答える 2

2

caseステートメントを使用できますか?何かのようなもの:

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

于 2012-04-25T11:15:35.260 に答える
1

SELECTステートメントに小さな条件を追加するだけです。例:-

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

...他のフィールドを追加します。

于 2012-04-25T11:17:14.340 に答える