在sqlite中更改列

问题描述 投票:0回答:7

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

Postgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

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

有什么想法吗?谢谢!

sqlite
7个回答
135
投票

sqlite 中没有 ALTER COLUMN。

我相信你唯一的选择是:

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

另一个 Stackoverflow 答案详细解释了该过程


68
投票

虽然确实没有 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
当此编译指示打开时,可以使用普通的 UPDATE、INSERT 和 DELETE 语句更改数据库所在的 SQLITE_MASTER 表。警告:滥用此编译指示很容易导致数据库文件损坏。

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

ALTER TABLE SYNTAX


34
投票

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. 承诺

欲了解更多详情,您可以参考链接


4
投票
  1. 创建表 temp_Table(x,y[,etc]);

  2. INSERT INTO temp_Table SELECT * FROM Table;

  3. 下降表表;

  4. 更改表 temp_Table 重命名为表;

感谢您帮助我找到确定的方法!


1
投票

ALTER COLUMN
不存在于
SQLite
中。

仅支持更改操作:

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

Alex Jasmin 的回答显示了可能的方法

参考:


0
投票

我建议您使用 SQLite 的 DB Browser。您可以使用它轻松更改约束。例如,在 SQLite 的数据库浏览器中,您可以转到数据库结构 -> 右键单击表 -> 单击修改表 -> 并取消选中 NN(非空)列,然后单击确定。


0
投票

如果您所做的只是更改列的类型,那么您通常不需要更改列,因为 SQLite 是动态类型的,您可以放置列类型以外的数据;列类型更多的是一种建议。您可能需要解决列类型(强制规则)带来的一些怪癖,但数据库会很乐意接受“错误”类型的数据。

在所有实践中,您通常不会大幅更改列的类型(在典型的数据库中,您通常只会更改类型的大小 - 例如

VARCHAR(16)
->
VARCHAR(32)
- 而不是类型的类别),因此唯一需要解决的问题是 NOT NULL 约束 - 在这种情况下,您可以使用此处其他有用的答案之一来实现您正在寻找的目标。

© www.soinside.com 2019 - 2024. All rights reserved.