2012-04-19 155 views
3

余米只是混淆在此查询,我不知道如何解决这个问题,如果你有任何想法,关于这个,请帮助我,或帮助肯定是赞赏查询更新问题

我有表结构像这样与测试列包含3值

enter image description here

UPDATE `test` SET test = test -3 

当我执行该查询的结果将是显示这样

enter image description here

UPDATE `test` SET test = test -4 

但是,当我执行这个查询测试列结果将不会正确保存喜欢或者我不需要任何减值也

需要此

enter image description here

0结果

+4

请发表表格定义。 – dcp 2012-04-19 16:39:09

+0

测试dataype是bignit @dcp – 2012-04-19 16:40:18

+1

well bigint是用于正整数,所以在0以下它又从最高处开始 – Hajo 2012-04-19 16:43:41

回答

2

显然你使用的是BIGINT UNSIGNED数据类型。如果你想存储负数,则需要将其更改为签署BIGINT定期(也请务必将其设置为NULLNOT NULL为必填项):

ALTER TABLE test 
    MODIFY COLUMN test BIGINT; 

UPDATE:如果你真的想存储0代替-4在你的例子中,你可以这样做使用GREATEST()这样的功能:

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

我需要0需要不是-1 – 2012-04-19 16:57:36

+0

Thanx分享你的exprience @Ike Walker – 2012-04-19 17:10:28

0

按照此问题:MySQL: bigint Vs int

bigint的最大值是18,446,744,073,709,551,615

由于您的bigint是无符号的,因此当您从0中减去时,您将环绕到最高值。

1

问题很可能是由于您的bigint是无符号的。

Per the documentation,一个无符号BIGINT是

甲大的整数。签署的范围是-9223372036854775808到 9223372036854775807无符号的范围是0到18446744073709551615.

通知未签名的范围,以及它如何为你的电话号码 - 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 2012-04-19 16:49:57

+0

我已经得到签名,但我需要0个结果需要 – 2012-04-19 16:59:27

+0

@Samad我刚更新了我的答案 – 2012-04-19 17:00:44