在sqlite中ALTER table ADD column foo timestamp default CURRENT_TIMESTAMP
是不可能的,但是有没有聪明的解决方法?
答案 0 :(得分:15)
在添加列时,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 */;
在所有行中将列值设置为 something (实际值无关紧要,重要的是所有行现在都有新列):
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;