加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 18:59:43 所属栏目:百科 来源:网络整理
导读:在sqlite中ALTER表ADD列foo时间戳默认为CURRENT_TIMESTAMP是不可能的,但是有没有聪明的解决方法? 解决方法 SQLite在添加列时实际上不会修改表内容,因此默认值必须是不需要读取表的值. 要解决此问题,您可以使用触发器而不是默认值: 添加没有默认值的列: AL
在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将不知道新的默认值).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读