如何根据表中值的存在创建SQLite触发器?

时间:2017-09-03 23:05:29

标签: sqlite triggers

我想创建一个SQLite trigger,它允许我根据现有行中是否存在值来设置行的特定属性的值。基本上我想要一个整数值的自动增量(让我们说count)对于一组行,这些行对于特定属性都具有相同的字符串值(让我们说name })。但是,我希望每个insert进入包含这些行的表中,以检查要插入的行name的值是否已经在表中。如果是,请继续自上一行(具有相同的namecount的自动增量。如果没有,请为该组启动count的新自动增量。我是SQLite的新手但知道一般的基础知识。我可以创建表格:

create table exampleTable(name string, count integer)

我想要一个示例输出(在不同name s的连续输入之后)看起来像这样:

name|count
alek|1
alek|2
kevin|1
blaise|1
alek|3
kevin|2
alek|4

现在我知道我可以将count设置为自动递增,只需将其定义为primary key,但随后每insert只会继续向上计数1,而不管name值。before insert。我相信这样做我需要以某种方式获取触发器来检查以前的值,所以我知道触发器必须使用name。不过,这就像我所知道的那样。我不知道如何设置,基本上是如何重新启动自动增量的if / else-type逻辑,我也不知道如何检查所有/任何表前面的行&# 39; ILLEGAL_ESCAPE: '"' ('\\' ~[btnfr"'\\] | ~'\\')*; 的值作为if / else的基础。

1 个答案:

答案 0 :(得分:2)

触发器无法更改要插入的值;更改count值的唯一方法是在之后对其进行UDPATE,即在AFTER INSERT触发器中。

一般来说,使用if / else逻辑和触发器的最简单方法是使用WHEN子句:

CREATE TRIGGER count_same_name
AFTER INSERT ON exampleTable
WHEN NEW.count IS NULL
 AND (SELECT count(*)
      FROM exampleTable
      WHERE name = NEW.name
     ) > 1
BEGIN
    UPDATE exampleTable
    SET count = (SELECT MAX(count)
                 FROM exampleTable
                 WHERE name = NEW.name
                ) + 1
    WHERE rowid = NEW.rowid;  -- or whatever the primary key is
END;

CREATE TRIGGER count_new_name
AFTER INSERT ON exampleTable
WHEN NEW.count IS NULL
 AND (SELECT count(*)
      FROM exampleTable
      WHERE name = NEW.name
     ) = 1
BEGIN
    UPDATE exampleTable
    SET count = 1
    WHERE rowid = NEW.rowid;
END;

但是在这种情况下,如果表中没有值,查找最大值将返回NULL,因此您只需使用ifnull()的单个触发器:

CREATE TRIGGER exampleTable_count
AFTER INSERT ON exampleTable
WHEN NEW.count IS NULL
BEGIN
    UPDATE exampleTable
    SET count = ifnull((SELECT MAX(count)
                        FROM exampleTable
                        WHERE name = NEW.name
                       ), 0) + 1
    WHERE rowid = NEW.rowid;
END;