解决方法
sqlite在添加列时实际上不会修改表内容,因此默认值必须是不需要读取表的值.
要解决此问题,您可以使用触发器而不是默认值:
>添加没有默认值的列:
ALTER TABLE MyTable ADD COLUMN foo timestamp DEFAULT NULL;
>使用触发器设置默认值:
ADD TRIGGER MyTable_foo_default AFTER INSERT ON MyTable FOR EACH ROW WHEN NEW.foo IS NULL BEGIN UPDATE MyTable SET foo = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid; END;
或者,首先修改表内容,以便所有行都有一个值,然后设置默认值:
>添加没有默认值的列:
ALTER TABLE MyTable ADD COLUMN foo timestamp DEFAULT NULL /* replace me */;
>将列值设置为所有行中的某个值(实际值无关紧要,重要的是所有行现在都有新列):
UPDATE MyTable SET foo = CURRENT_TIMESTAMP;
>更改默认值(文档:PRAGMA writable_schema,sqlite_master):
PRAGMA writable_schema = on; UPDATE sqlite_master SET sql = replace(sql,'DEFAULT NULL /* replace me */','DEFAULT CURRENT_TIMESTAMP') WHERE type = 'table' AND name = 'MyTable'; PRAGMA writable_schema = off;