2017-10-08 2 views
1

問題:sqlite3_execでこれを実行すると、SQLiteは "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 [documentation](http://www.sqlite.org/lang_createtrigger.html)は、 'rowid' valusがいつ有効かを示します。 –

関連する問題