問題は、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 に設定し、それ以外の場合は減算を実行します。