2017-10-08 36 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有效。 –