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

时间:2014-09-18 11:14:53

标签: sqlite timestamp alter

在sqlite中ALTER table ADD column foo timestamp default CURRENT_TIMESTAMP是不可能的,但是有没有聪明的解决方法?

1 个答案:

答案 0 :(得分:15)

在添加列时,SQLite实际上并不修改表内容,因此默认值必须是不需要读取表的值。

要解决此问题,您可以使用触发器而不是默认值:

  1. 添加没有默认值的列:

    ALTER TABLE MyTable ADD COLUMN foo timestamp DEFAULT NULL;
    
  2. 使用触发器设置默认值:

    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;
    
  3. 或者,首先修改表格内容,使所有行都有一个值,然后设置默认值:

    1. 添加没有默认值的列:

      ALTER TABLE MyTable ADD COLUMN foo timestamp DEFAULT NULL /* replace me */;
      
    2. 在所有行中将列值设置为 something (实际值无关紧要,重要的是所有行现在都有新列):

      UPDATE MyTable SET foo = CURRENT_TIMESTAMP;
      
    3. 更改默认值(文档:PRAGMA writable_schemasqlite_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;
      
    4. 重新打开数据库(否​​则,SQLite将不知道新的默认值)。