动态设置默认 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;
我有一个要创建的 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;