为什么Sqlite错误:无法在表上创建INSTEAD OF触发器?

时间:2012-02-28 18:10:15

标签: database triggers sqlite

我尝试为表上的更新创建一个替代触发器。正常使用的替代触发器是视图,但Sqlite手册说,替代触发器对表也有效。但我收到错误:无法在表上创建INSTEAD OF触发器。我想知道为什么。

我使用外键:

PRAGMA foreign_keys = ON;

我有两张桌子。标识符表:

CREATE TABLE id
(
    id      INTEGER PRIMARY KEY AUTOINCREMENT,
    created REAL    NOT NULL DEFAULT CURRENT_TIMESTAMP
);

引用标识符的表:

CREATE TABLE person
(
    id        INTEGER NOT NULL DEFAULT (last_insert_rowid()) REFERENCES id,
    login     TEXT,
    password  TEXT,
    firstname TEXT,
    lastname  TEXT,
    email     TEXT,
    created   REAL  NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id, created)
);

插入正常:

INSERT INTO id DEFAULT VALUES;
INSERT INTO person (login) VALUES ('root');
SELECT * FROM person;
1|root|||||2012-02-28 18:03:45

现在我想定义以下触发器,它将更新转换为插入:

CREATE TRIGGER person_update INSTEAD OF UPDATE OF login, password, firstname, lastname, email ON person
BEGIN
    INSERT INTO person (login, password, firstname, lastname, email)
    VALUES (new.login, new.password, new.firstname, new.lastname, new.email);
END;

但它因上述错误而失败,我不明白为什么。

3 个答案:

答案 0 :(得分:9)

我尝试浏览the source code(搜索“无法创建INSTEAD OF”),尽管在评论中读取了创建触发器语句的详细概述,但我会说{{1仅适用于视图,不能与表一起使用。

答案 1 :(得分:1)

我希望这只是帖子中的拼写错误,但您的create声明应为:

INSTEAD OF UPDATE ON

你输入了:

INSTEAD OF UPDATE OF 

答案 2 :(得分:0)

只需创建一个视图person_view as select * from person并将触发器指向它。