3

このクエリで混乱しているだけで、これを解決する方法がわかりません。これについて何か考えがある場合は、助けてください。または、助けていただければ幸いです。

このようなテーブル構造があり、テスト列には3つの値が含まれています

ここに画像の説明を入力

UPDATE `test` SET test = test -3

このクエリを実行すると、結果は次のように表示されます

ここに画像の説明を入力

UPDATE `test` SET test = test -4

しかし、このクエリを実行すると、結果はこのようなテスト列に適切に保存されません

ここに画像の説明を入力

必要な結果が 0 であるか、減算値も必要ありません

4

3 に答える 3

2

どうやらあなたはBIGINT UNSIGNEDデータ型を使用しています。負の数を格納する場合は、通常の符号付きに変更する必要がありますBIGINT(また、必要に応じて、NULLまたはNOT NULL必要に応じて設定してください)。

ALTER TABLE test
  MODIFY COLUMN test BIGINT;

更新:例で実際に-4ではなく0を格納したい場合は、次のGREATEST()ような関数を使用して格納できます。

UPDATE `test` SET test = GREATEST(CAST(test AS SIGNED) - 4,0)
于 2012-04-19T16:53:40.857 に答える
1

問題は、bigint が署名されていないことが原因である可能性が最も高いです。

ドキュメントによると、unsigned bigint は

大きな整数。符号付きの範囲は -9223372036854775808 ~ 9223372036854775807 です。符号なしの範囲は 0 ~ 18446744073709551615 です。

符号なしの範囲とそれがあなたの数字であることに注意してください-3(4は0からxxx15までの取得に由来すると思います)

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

ALTER TABLE test MODIFY COLUMN test BIGINT SIGNED;

アップデート

負の数を持てないように BIGINT UNSIGNED を保持したい場合は、0 を強制するトリガーを作成するか、クエリを次のようにすることができます。

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

基本的に、減算しようとしている値が現在の値よりも大きい場合は、値を 0 に設定し、それ以外の場合は減算を実行します。

于 2012-04-19T16:49:06.207 に答える
0

この質問に従って: MySQL: bigint Vs int

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

bigint は署名されていないため、0 から減算すると、最高値にラップアラウンドします。

于 2012-04-19T16:46:31.160 に答える