【问题标题】:SQLITE: stop execution if select returns specific valueSQLITE:如果选择返回特定值,则停止执行
【发布时间】:2016-01-03 19:21:46
【问题描述】:

有没有办法为 sqlite 编写一个 SQL 输入文件,它会以某种方式“抛出”错误,例如。如果不满足条件,则退出事务并回滚?

我有一个脚本应该做某事,但前提是一个表中有特定行。如果它不存在,则脚本的执行可能会产生致命的结果并损坏数据库。

该脚本现在仅按需启动,但我更愿意添加一个故障安全功能,以防万一出现问题。

基本上我需要的是类似的东西

/* IF */ SELECT value FROM meta WHERE key = 'version' /* != hardcoded_version_string THROW SOME EXCEPTION */

有没有办法做到这一点?在 Postgre / Oracle 中,这可以使用 PLSQL 来完成,但我不确定 sqlite 是否支持这样的事情?

【问题讨论】:

    标签: sql sqlite sqltransaction


    【解决方案1】:

    Triggers可以使用RAISE函数产生错误:

    CREATE VIEW test AS SELECT NULL AS value;
    CREATE TRIGGER test_insert
    INSTEAD OF INSERT ON test
    BEGIN
      SELECT RAISE(FAIL, 'wrong value')
      WHERE NEW.value != 'fixed_value';
    END;
    
    INSERT INTO test SELECT 'fixed_value';
    INSERT INTO test SELECT 'whatever';
    Error: wrong value
    

    【讨论】:

      【解决方案2】:

      有没有什么方法可以为 sqlite 编写一个 SQL 输入文件 以某种方式“抛出”错误,例如。退出事务并回滚,如果 不满足条件?

      一种解决方法可能是创建虚拟表并明确违反NULL 约束:

      CREATE TABLE meta("key" VARCHAR(100));
      INSERT INTO meta("key") VALUES ('version');
      
      CREATE TEMPORARY TABLE dummy(col INT NOT NULL);
      

      交易:

      BEGIN TRANSACTION;
      
      INSERT INTO dummy(col)
      SELECT NULL                    -- explicit insert of NULL
      FROM meta  
      WHERE "key" = 'version';
      -- Error: NOT NULL constraint failed: dummy.col
      
      -- rest code
      INSERT INTO meta("key")
      VALUES ('val1');
      
      INSERT INTO meta("key")
      VALUES ('val2');
      -- ...
      
      COMMIT;
      

      SqlFiddleDemo

      请记住,SQLite 不是过程语言,这个解决方案有点难看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-15
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 2013-05-18
        相关资源
        最近更新 更多