【问题标题】:ALTER COLUMN in sqlitesqlite 中的 ALTER 列
【发布时间】:2021-07-28 15:06:32
【问题描述】:

如何更改 sqlite 中的列? 这是Postgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

我相信sqlite中根本没有ALTER COLUMN,只支持ALTER TABLE。

有什么想法吗?谢谢!

【问题讨论】:

  • 您要求使用 ALTER COLUMN 语法,但没有说出您想要做什么。这让我觉得这太宽泛了。 ALTER COLUMN 可以做很多事情,您是否希望像 pg 示例中那样删除 not null 约束?
  • 如果您使用 intellj db 工具,当您更改列时,它会为您的 sqlite 生成命令。

标签: sqlite


【解决方案1】:

sqlite 中没有 ALTER COLUMN。

我相信你唯一的选择是:

  • 将表重命名为临时名称
  • 创建没有 NOT NULL 约束的新表
  • 将旧表的内容复制到新表中
  • 删除旧表

This other Stackoverflow answer详细解释流程

【讨论】:

    【解决方案2】:

    虽然确实没有 ALTER COLUMN,但如果您只想重命名列、删除 NOT NULL 约束或更改数据类型,则可以使用以下一组 危险命令:强>

    PRAGMA writable_schema = 1;
    UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
    PRAGMA writable_schema = 0;
    

    您将需要关闭并重新打开连接或清理数据库以将更改重新加载到架构中。

    例如:

    Y:\> **sqlite3 booktest**  
    SQLite version 3.7.4  
    Enter ".help" for instructions  
    Enter SQL statements terminated with a ";"  
    sqlite> **create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT 
    NULL);**  
    sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**  
    Error: BOOKS.publication_date may not be NULL  
    sqlite> **PRAGMA writable_schema = 1;**  
    sqlite> **UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT 
    NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';**  
    sqlite> **PRAGMA writable_schema = 0;**  
    sqlite> **.q**  
    
    Y:\> **sqlite3 booktest**  
    SQLite version 3.7.4  
    Enter ".help" for instructions  
    Enter SQL statements terminated with a ";"  
    sqlite> **insert into BOOKS VALUES ("NULLTEST",null);**  
    sqlite> **.q**  
    

    参考如下:


    pragma writable_schema
    当这个 pragma 开启时,可以使用普通的 UPDATE、INSERT 和 DELETE 语句来更改数据库所在的 SQLITE_MASTER 表。警告:滥用此编译指示很容易导致数据库文件损坏。

    [更改表](来自http://www.sqlite.org/lang_altertable.html
    SQLite 支持有限的 ALTER TABLE 子集。 SQLite 中的 ALTER TABLE 命令允许用户重命名表或向现有表添加新列。无法重命名列、删除列或在表中添加或删除约束。

    【讨论】:

    • 这个方法对我有用,虽然为了避免列可能处于不同顺序的情况(即从以前的 ADD COLUMN 命令),我使用: UPDATE SQLITE_MASTER SET SQL = replace(SQL, '[MyColumn] integer NOT NULL', '[MyColumn] integer NULL') WHERE NAME = 'MyTable'。此外,请注意不要将其作为事务的一部分运行 - 它可能会阻止一些较早的事务命令运行。
    【解决方案3】:

    SQLite 支持有限的 ALTER TABLE 子集。 SQLite 中的 ALTER TABLE 命令允许用户重命名表或向现有表添加新列。无法重命名列、删除列或在表中添加或删除约束。但您可以通过以下步骤更改表列数据类型或其他属性。

    1. 开始交易;
    2. 创建临时表 t1_backup(a,b);
    3. 插入到 t1_backup 从 t1 中选择 a、b;
    4. 删除表 t1;
    5. 创建表 t1(a,b);
    6. 插入到 t1 从 t1_backup 中选择 a、b;
    7. 删除表 t1_backup;
    8. 提交

    更多详情可以参考link

    【讨论】:

    • 重命名表:ALTER TABLE table1 RENAME TO table2;
    • 不要忘记索引。运行 .schema 生成带有索引的 create 语句。
    【解决方案4】:
    1. 创建表 temp_Table(x,y[,etc]);

    2. INSERT INTO temp_Table SELECT * FROM Table;

    3. DROP TABLE 表;

    4. ALTER TABLE temp_Table 重命名为表;

    感谢你帮我找到了一个确定的方法!

    【讨论】:

      【解决方案5】:

      ALTER COLUMNSQLite 中不存在。

      仅支持更改操作:

      • 更改表名
      • 更改表列名称
      • 添加新列
      • 删除列

      Alex Jasmin's answer shows possible way

      参考:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 2020-01-24
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        相关资源
        最近更新 更多