在sqlite中不可能使用ALTER table ADD column foo timestamp default CURRENT_TIMESTAMP
的方式添加列,但是是否有巧妙的解决方法?
当向表添加列时,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;
sqlite_master
,而原始连接还有一个未提交的事务。 - CL.