2017-10-08 110 views
1

问题:SQLite在通过sqlite3_exec运行时产生“接近DEFAULT:语法错误”。插入在触发器外部正常工作,其他语句在触发器内部工作,但不知何故,DEFAULT VALUES在触发器内不能工作。这是为什么发生?在触发后插入默认值时出现SQLite语法错误

SQLite的代码:

CREATE TABLE Symbol (
    Label VARCHAR(127) PRIMARY KEY 
); 
CREATE TABLE Process (
    Name INTEGER PRIMARY KEY 
); 
CREATE TABLE Named_Process_Definition (
    Label VARCHAR(127), 
    Name INTEGER, 
    FOREIGN KEY (Label) REFERENCES Symbol (Label), 
    FOREIGN KEY (Name) REFERENCES Process_Definition (Name) 
); 
CREATE TRIGGER pre_new_named_process BEFORE INSERT ON Named_Process_Definition 
    BEGIN 
    INSERT INTO Symbol (Label) VALUES (NEW.Label); 
    END; 
CREATE TRIGGER post_new_named_process AFTER INSERT ON Named_Process_Definition 
    BEGIN 
    INSERT INTO Process DEFAULT VALUES; 
    UPDATE Named_Process_Definition SET Name=last_insert_rowid() WHERE rowid=NEW.rowid; 
    END; 

触发器是为了简化,通过自动生成的内部“无名”资源,例如流程插入Named_Process_Definitions。

回答

1

sqlite docs状态:

INSERT语句的 “INSERT INTO表默认值” 的形式,不支持。

您可以解决此通过插入一个空,例如:

CREATE TRIGGER post_new_named_process AFTER INSERT ON Named_Process_Definition 
    BEGIN 
    INSERT INTO Process(rowid) VALUES(NULL); 
    END; 
+0

错过了一些代码,坚持更新问题...是有效的rowid插入后?那是我可以在触发器中将Named_Process_Definition.Name设置为它吗? – Andreas

+0

@Andreas [文档](http://www.sqlite.org/lang_createtrigger.html)告诉你何时'rowid' valus有效。 –