更改sqlite表以添加具有默认值的时间戳列

前端之家收集整理的这篇文章主要介绍了更改sqlite表以添加具有默认值的时间戳列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
sqlite中ALTER表ADD列foo时间戳默认为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 */;

>将列值设置为所有行中的某个值(实际值无关紧要,重要的是所有行现在都有新列):

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将不知道新的默认值).

猜你在找的Sqlite相关文章