MySQL 如何讓一個字段的值不能被減為負(fù)數(shù)

當(dāng)用數(shù)據(jù)庫存儲一個數(shù)值,并且這個數(shù)值需要被增減的時候,比如物品的數(shù)量。

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

假設(shè)表數(shù)據(jù)如下:

skunum

a10

b20

假設(shè)現(xiàn)在 a 的 num 要 減少10個。

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

在并發(fā)的情況下,a 的 num 會變成 -10 當(dāng)然,前提你的 sql 是這么寫的:

UPDATEtableSETnum=num-10WHEREsku="a"

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

$data ='select * from table where sku="a"';$num =$data['num'] -10;UPDATEtableSETnum=$numWHEREsku="a"

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

方案1:

利用數(shù)據(jù)庫的事務(wù),

在 update ?的 sql 執(zhí)行完成后,select num 的值判斷是否小于0,如果小于,回滾。

方案2:

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

即字段屬性中的 ?UN,Unisigned

參考 sql :

ALTERTABLE`table`CHANGECOLUMN`num``num`INT(11)UNSIGNEDNOTNULLDEFAULT'0';

這種情況下,當(dāng) num 被減成負(fù)數(shù)的時候,數(shù)據(jù)庫會返回錯誤。

Error Code:1690. BIGINT UNSIGNED valueisoutofrangein......


我自己測試的實例:



附上一張Mysql字段屬性:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容