如果为null则回滚

时间:2016-04-26 08:10:30

标签: sql rollback

我正在阅读有关回滚交易的文章,无法找到我需要的内容。假设我有一个用户表。用户可以更新他/她的记录,但如果输入的值为null,我想要回滚。我知道有很多简单的方法可以做到这一点,比如使用c#检查它是否为null,这样的事情,但指向这里是理解回滚。如何使用if(null)代码回滚?

3 个答案:

答案 0 :(得分:2)

有三种方法。首先,如果您的检查仅在一列上,请对列定义使用check约束:

 create table test (
      age int check (age > 40),
      ...  
 );

对于更复杂的约束,您需要triggers。可用的触发器类型取决于技术(oracle,sql server,mysql)。在插入之前的或更新之前的触发器内部,您可以生成异常,该异常将自动结束事务(相当于回滚)。这是一个mysql示例:

delimiter //
drop trigger if exists trg_trigger_test_ins //
create trigger trg_trigger_test_ins before insert on test
for each row
begin
    declare msg varchar(128);
    if new.age <= 40 then
        set msg = concat('MyTriggerError: age incorrect : ', cast(new.id as char));
        signal sqlstate '45000' set message_text = msg;
    end if;
end
//

最后,您可以启动事务,进行更改,然后决定是否要提交回滚

答案 1 :(得分:2)

回滚与事务一起使用,回滚将状态恢复为执行begin tran时的状态。

BEGIN TRAN 'tran1'
       INSERT INTO Whatever table...
      IF(... check for null)
      BEGIN 
        ROLLBACK TRAN 'tran1'
        RETURN 0
      END
COMMIT TRAN 'tran1'

答案 2 :(得分:0)

要回滚交易,您必须先启动交易。作为规则,DBMS具有隐式事务,如果没有指定,则每个语句或批处理启动并提交/回滚它自己的事务。或者您可以显式定义事务边界。

因此,如果您需要任何(隐式,显式)事务,该事务涉及将给定列设置为NULL以使其失败并回滚,则只需在此列上定义约束。

或者,您可能只需要一些显式事务回滚,具体取决于此列值和其他一些条件。因此,您应该在代码中明确检查。