Tomorrow's Chance

社会人なりたてのエンジニア奮闘記

MysqlでトランザクションをサポートしてるエンジンでのUnsigned制約

仕事初めですがこんなことではまるとは・・・正月ボケでした。

 

参考サイト

http://d.hatena.ne.jp/do_aki/20131204/1386127677

 

とあるバグfixの関係でPHPで再計算してるところをひとまず一回一括でデータの不整合を修正しようということになったのですが、それ用にUpdate文を用意しようとしてunsigned制約のかかっているカラムに対する計算で「カラムAとカラムBの差が0以上の場合は〜」というようなアホなIF文を書いてですね。

 

ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in

 

当然のように怒られたわけです。で、試しにSELECTに置き換えてみても怒られる。上記の参考サイトではUPDATE文で検証されていますが、SELECT文でSETする値を取得させてみても同じエラーがでます。わざわざUnsigned制約をつけてるところに負数をいれようとするのがそもそもアレなんですが、どうやらInnoDB等のトランザクションをサポートするエンジンでは厳密に評価するようになったようです。