动态设置默认 SQLite3 字段

Setting Default SQLite3 Fields Dynamically

我有一个要创建的 SQLite3 数据库。我希望一个 INTEGER 字段(名为 "Length")的默认值等于另一个字段(名为 "Pattern")中字符串的长度。

CREATE TABLE knowledge (
    Entry INTEGER   PRIMARY KEY   AUTOINCREMENT,
    Priority TINYINT UNSIGNED   CHECK (0 <= Priority < 15),
    Pattern TEXT   NOT NULL,
    Length INTEGER UNSIGNED   DEFAULT 'LENGTH(Pattern);'
);

但是,当前的 table 设置并未 "dynamically" 设置所需的 "Length" 值。

如何将 "Length" 的默认值正确设置为 "Pattern" 字段的字符串长度?

默认值必须是常量。

您可以使用 trigger 代替:

CREATE TRIGGER knowledge_length_default
AFTER INSERT ON knowledge
FOR EACH ROW
WHEN NEW.Length IS NULL
BEGIN
    UPDATE knowledge
    SET Length = length(NEW.Pattern)
    WHERE Entry = NEW.Entry;
END;

您要分配的默认值是动态的,sqlite 不支持。一种解决方案是什么 CL。说。我会将默认值定义为 0,并且不使用一个触发器而是使用两个触发器(一个用于插入,另一个用于更新)。

CREATE TRIGGER default_length_on_insert AFTER INSERT ON knowledge WHEN NEW.Length IS 0
BEGIN
UPDATE knowledge SET Length=length(NEW.Pattern) WHERE ROWID = NEW.ROWID;
END;

CREATE TRIGGER default_length_on_update AFTER UPDATE ON knowledge
BEGIN
UPDATE knowledge SET Length=length(NEW.Pattern) WHERE ROWID = NEW.ROWID;
END;