2012-04-19 17 views
3

私は、このクエリでは混乱だけMとあなたがこのことについてどんな考えを持っている場合、私はこの問題を解決する方法がわからない私を助けたり、助けてくださいは間違いなくクエリ更新問題

を高く評価している私はこの、テストのようなテーブル構造を持っています私はこのクエリを実行すると、結果がこの

のようにショーとなります

enter image description here

UPDATE `test` SET test = test -3 

3値を列に含まれています

UPDATE `test` SET test = test -4 

しかし、ときに私は結果がこの

enter image description here

0必要な結果のようなテストの欄には、適切な保存されませんか、私も

を任意の減算値を必要としないこのクエリを実行します
+4

テーブル定義をポストしてください。 – dcp

+0

テストdataypeはbignit @dcpです –

+1

正の整数に対してはbigintが作られていますので、0より下では再び上から開始します – Hajo

答えて

2

明らかに、あなたはBIGINT UNSIGNEDデータ型を使用しています。あなたが負の数を保存したい場合は、(また、必要に応じてNULLまたはNOT NULLに設定してください)BIGINT署名定期的に変更する必要があります。

ALTER TABLE test 
    MODIFY COLUMN test BIGINT; 

UPDATE:あなたは実際に保存したい場合はあなたの例では-4の代わりに0を使用している場合は、次のようなGREATEST()関数を使用してください:

UPDATE `test` SET test = GREATEST(CAST(test AS SIGNED) - 4,0) 
+0

私は0必要はありません-1 –

+0

あなたのexprienceを共有するためのThanx @Ike Walker –

0

この質問の通り:MySQL: bigint Vs int

bigintの最大値は18,446,744,073,709,551,615

bigintは符号なしなので、0から引き算すると最も高い値に折り返します。

1

問題は、bigintが符号なしである可能性が高いためです。

Per the documentationは、符号なしのBIGINTは

大きい整数です。署名範囲は、-9223372036854775808それはあなたの番号であるか符号なしの範囲は0お知らせ符号なし範囲を

18446744073709551615.にされ 9223372036854775807に - 3(4 0からxxx15になってから来て、私は信じている)

したがって、署名されていない(署名されていない)bigintになるように列を更新するだけで済みます。これはうまくいくはずです。

ALTER TABLE test MODIFY COLUMN test BIGINT SIGNED; 

UPDATE

あなたが負の数を持っていないことができるようにBIGINT UNSIGNEDを維持したい場合は、0を強制的にトリガを書くことができ、またはあなたは自分のクエリを作ることができるようなものこれは:減算することしようとした値が現在の値よりも大きい場合

UPDATE test 
SET test = CASE WHEN test >= value THEN test-value ELSE 0 END 

基本的には、その後だけさもなければ減算を行い、値を0に設定します。

+0

http://dev.mysql.com/doc/refman/5.5/en/integer-types.html – Hajo

+0

私はすでに署名をしていますが、結果が0になる必要があります –

+0

@Samad私はこのために私の答えを更新しました –