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