插入INSERT触发器时,触发递归级别太多

时间:2014-06-24 17:11:45

标签: sqlite triggers

我想为在SQLite3表中创建或插入的每个新行创建一个UniqueIdentifier。我在这个论坛上搜索了解决方案,我找到了两个" Select Statements"创建这样一个UniqueIdentifier。代码如下:

SELECT substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)||
  '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
    select lower(hex(randomblob(16))) as u, substr('89ab',random() % 4 + 1, 1) as v);

当我在Firefox SQLite Manager中输入SQL时,它可以很好地提供我想要使用的值。

我尝试将创建的值用于表中,但它不起作用。我总是收到错误消息"太多的递归......"

我使用以下SQL代码来创建工作正常的表。

CREATE TABLE "SampleTable" (
"SampleTableID" integer PRIMARY KEY AUTOINCREMENT  NOT NULL , 
"SampleTableUID" varchar(32) UNIQUE NOT NULL, 
"Name" varchar(50), 
)

然后我尝试使用以下SQL代码来创建触发器,但这不起作用。在我的一个试验中,我首先创建了一个数据记录,然后创建了触发器,当我添加第二个数据记录时它似乎正常工作。

CREATE TRIGGER "UID" AFTER INSERT ON "SampleTable" FOR EACH ROW  BEGIN INSERT INTO "SampleTable" ("SampleTableUID") 
SELECT substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)||
  '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
select lower(hex(randomblob(16))) as u, substr('89ab',random() % 4 + 1, 1) as v); END

我做错了什么?

我想用第一个数据记录和所有后续记录创建这个UniqueIdentifier。


正确的代码如下:


感谢CL的帮助,我自己找到了答案。正确的工作解决方案是:

    CREATE TABLE "SampleTable" (
"SampleTableID" integer PRIMARY KEY AUTOINCREMENT  NOT NULL , 
"SampleTableUID" varchar(32), 
"Name" varchar(50) 
)


CREATE TRIGGER "UID" 
AFTER INSERT ON "SampleTable" 
FOR EACH ROW
BEGIN 
UPDATE "SampleTable"
SET "SampleTableUID" = (SELECT substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)||
  '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
    select lower(hex(randomblob(16))) as u, substr('89ab',random() % 4 + 1, 1) as v))
WHERE rowid = last_insert_rowid();
END


INSERT INTO "SampleTable" ("Name") VALUES ("Name1");

谢谢!

1 个答案:

答案 0 :(得分:1)

INSERT语句向表中添加一条新记录。

要更改插入行中的内容,必须使用UPDATE语句:

CREATE TRIGGER UID
AFTER INSERT ON SampleTable
FOR EACH ROW
WHEN NEW.SampleTableUID IS NULL
BEGIN
    UPDATE SampleTable
    SET SampleTableUID = (SELECT whatever...)
    WHERE SampleTableID = NEW.SampleTableID;
END;