如果为空则回滚

Rollback if null

我正在阅读有关回滚事务的文章,但找不到我需要的东西。假设我有一个用户 table。用户可以更新 his/her 条记录,但如果输入的值为空,我想回滚。我知道有很多简单的方法可以做到这一点,比如用 c# 检查它是否为 null 之类的,但这里的要点是理解回滚。如何使用带有 if(null) 代码的回滚?

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

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

对于更复杂的约束,您将需要 triggers。可用的触发器类型取决于技术(oracle、sql 服务器、mysql)。在 before insertbefore update 触发器中,可以产生异常,自动结束事务(相当于回滚)。这是一个 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
//

最后,您可以开始 事务,进行更改,然后决定是要提交还是回滚.

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

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

要回滚事务,您必须先启动事务。通常 DBMS 有隐式事务,如果没有指定,每个语句或批处理都会启动并且 commits/rollbacks 它是自己的事务。或者您可以显式定义事务范围。

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

或者,您可能只需要一些明确的事务回滚,具体取决于此列值和其他一些条件。所以你应该明确地在你的代码中进行这个检查。