MySQL如何讓一個字段的值不能被減為負數


當用數據庫存儲一個數值,並且這個數值需要被增減的時候,比如物品的數量。

在這種場景下,物品的數量是不能為負數的。那如何確保在扣減這個數量的時候,不會被扣成負數呢。

假設表數據如下:

sku num
a 10
b 20

假設現在 a 的 num 要 減少10個。

用程序在操作之前判斷? num 是否足夠扣減 ? 這明顯是不靠譜的。因為有並發的情況存在。

在並發的情況下,a 的 num 會變成 -10 當然,前提你的 sql 是這么寫的:

UPDATE table SET num=num-10 WHERE sku="a"

絕對不能用程序去計算 num 的值,在賦值到 sql 中,在並發情況下  num 會變成 0,錯誤示例:

$data = 'select * from table where sku="a"';
$num = $data['num'] - 10;
UPDATE table SET num=$num WHERE sku="a"

所有的方案必須有正確的操作 sql 也就是,第一種 sql。

方案1:

利用數據庫的事務,

在 update  的 sql 執行完成后,select num 的值判斷是否小於0,如果小於,回滾。

方案2:

更改 num 字段的屬性,無符號整形。

即字段屬性中的  UN,Unisigned

參考 sql :

ALTER TABLE `table`
CHANGE COLUMN `num` `num` INT(11) UNSIGNED NOT NULL DEFAULT '0' ;

這種情況下,當 num 被減成負數的時候,數據庫會返回錯誤。

Error Code: 1690. BIGINT UNSIGNED value is out of range in ....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM