限制MySQL中字段的值?

时间:2014-04-02 06:38:38

标签: mysql sql max min

我正在开发一个使用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。找到MINMAX here,但它们似乎不是正确的。

在MySQL中实现这样一个限制的最佳方式(如果有的话)(不是调用MySQL的代码)?

3 个答案:

答案 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 - 但我为-33留下了两个单独的约束。这里的好处是 - DBMS将自己处理您的数据 - 您将能够按原样传递数据,而不用担心范围。但是 - 也存在弱点:在第一种情况下,您可以更改查询文本以调整所需范围,在第二种情况下,如果您想要更改约束(因此灵活性较低),则必须再次重新创建触发器。

此外,您可能不仅要检查UPDATE语句中的数据,还要检查INSERT上的数据。

答案 1 :(得分:1)

使用GREATESTLEAST代替MAX和MIN

你也可以使用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;