日期:2014-05-16  浏览次数:20868 次

mysql限制表的字段的值在每次插入时只能大于上一条记录的值
假设有一个表 tb_test
里面有4个字段,分别是ID int,ValueTime datetime,fValue1 float(11,1),fValue1 float(11,1)

上一条记录是:1,2012-08-31 09:09:12 33.4,56.7
当插入新的一行是:1,2012-08-31 09:33:15 44.5 67.9 -- 成功
当插入新的一行是:2,2012-08-31 09:33:15 20.5 77.9 -- 20.5<44.5
则插入的一行变成: 2,2012-08-31 09:33:15 44.5 77.9
即这个字段的最后一次插入的值小于上条记录的值时,此字段的值保持原值。
不知道有没有人理解我说的?


------解决方案--------------------
你可以在触发器中实现这个检查。

http://blog.csdn.net/acmain_chm/article/details/4380183
 MySQL 中如何在触发器里中断记录的插入或更新?
MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢? 下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。 mysql> create table t_control(id int primary key);Query OK, 0 row...

------解决方案--------------------
SQL code
如果表的ID 不是自增的:

root@localhost : test 10:00:21>select * from tb_test;
+------+---------------------+--------+--------+
| id   | time                | value1 | value2 |
+------+---------------------+--------+--------+
|    1 | 2012-09-01 09:41:00 |   33.4 |   56.7 |
+------+---------------------+--------+--------+
1 row in set (0.00 sec)

root@localhost : test 09:59:37>delimiter $$
root@localhost : test 10:00:17>create trigger insert_tb
    -> before insert on tb_test
    -> for each row
    -> begin
    -> select max(value1) into @a from tb_test;
    -> if new.value1 < @a then set new.value1= @a;
    -> end if;
    -> end $$
Query OK, 0 rows affected (0.07 sec)

root@localhost : test 10:00:36>insert into tb_test values(1,now(),'12.4','56.7');
Query OK, 1 row affected (0.03 sec)

root@localhost : test 10:00:51>select * from tb_test;
+------+---------------------+--------+--------+
| id   | time                | value1 | value2 |
+------+---------------------+--------+--------+
|    1 | 2012-09-01 09:41:00 |   33.4 |   56.7 |
|    1 | 2012-09-01 10:00:51 |   33.4 |   56.7 |
+------+---------------------+--------+--------+
2 rows in set (0.00 sec)

root@localhost : test 10:00:54>insert into tb_test values(1,now(),'55.4','56.7');
Query OK, 1 row affected (0.00 sec)

root@localhost : test 10:01:03>select * from tb_test;
+------+---------------------+--------+--------+
| id   | time                | value1 | value2 |
+------+---------------------+--------+--------+
|    1 | 2012-09-01 09:41:00 |   33.4 |   56.7 |
|    1 | 2012-09-01 10:00:51 |   33.4 |   56.7 |
|    1 | 2012-09-01 10:01:03 |   55.4 |   56.7 |
+------+---------------------+--------+--------+
3 rows in set (0.00 sec)


是自增的话,修改下赋值这行就可以了。