我正在开发一个使用MySQL数据库来存储数据的程序。我有一张桌子(这里简化):
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| dataId | int(10) unsigned | NO | PRI | NULL | auto_increment |
| someNum | tinyint(4) | NO | | 0 | |
+---------+------------------+------+-----+---------+----------------+
现在,我使用类似这样的查询更新表。
UPDATE table SET someNum=someNum+2 WHERE dataId=78225;
ID和someNum
更改量来自代码。
现在,我想要做的是将someNum
的值限制在-3到3之间,尤其是UPDATE
。这不是必需的,我的软件可以处理它超出该范围,但数据将更加清晰。如果someNum+2
超过3,我只想将其设置为3。
数字MIN
/ MAX
可以轻松实现:
UPDATE table SET someNum=MAX(-3,MIN(3,someNum+2)) WHERE dataId=78225;
我查看了文档here,但数字似乎没有MIN
/ MAX
。找到MIN
和MAX
here,但它们似乎不是正确的。
在MySQL中实现这样一个限制的最佳方式(如果有的话)(不是调用MySQL的代码)?
答案 0 :(得分:2)
第一种方式:使用LEAST()
和GREATEST()
:
UPDATE t SET someNum=GREATEST(-3,LEAST(3,someNum+2)) WHERE dataId=78225;
这是最简单的方法,因为您将所有逻辑存储在一个UPDATE
查询中。
第二种方式:创建trigger:
DELIMITER //
CREATE TRIGGER catCheck BEFORE UPDATE ON t
FOR EACH ROW
BEGIN
IF NEW.someNum<-3 THEN
NEW.someNum=-3;
END IF;
IF NEW.someNum>3 THEN
NEW.someNum=3;
END IF;
END;//
DELIMITER ;
您也可以将IF
替换为CASE
- 但我为-3
和3
留下了两个单独的约束。这里的好处是 - DBMS将自己处理您的数据 - 您将能够按原样传递数据,而不用担心范围。但是 - 也存在弱点:在第一种情况下,您可以更改查询文本以调整所需范围,在第二种情况下,如果您想要更改约束(因此灵活性较低),则必须再次重新创建触发器。
此外,您可能不仅要检查UPDATE
语句中的数据,还要检查INSERT
上的数据。
答案 1 :(得分:1)
你也可以使用CASE WHEN
update table
set someNum = CASE WHEN SomeNum +2 > 3 THEN 3
WHEN SomeNum +2 < -3 THEN -3
ELSE someNum + 2
END)
答案 2 :(得分:1)
MySQL中的相应功能是greatest()
和least()
,而不是max()
/ min()
。但是,我认为只有一个case
声明就更清楚了:
UPDATE table
SET someNum = (case when someNum + 2 < -3 then -3
when someNum + 2 > 3 then 3
else someNum + 2
end)
WHERE dataId=78225;