SQLite 修改列

55
我需要修改 SQLite 数据库中的一列,但由于该数据库已经在生产中,所以必须以程序方式进行修改。通过我的研究,我发现为了做到这一点,必须按照以下步骤操作:
1. 创建一个具有新模式的新表 2. 将旧表中的数据复制到新表中 3. 删除旧表 4. 将新表重命名为旧表的名称
这似乎是一项过于繁琐的工作,而本应该相对容易。难道没有更简单的方法吗?我只需要更改现有列上的约束条件并为其设置默认值。

可能是在sqlite3中修改列类型的重复问题。 - rubo77
我在这里创建了一个脚本来重命名表中的字段。https://dev59.com/_nI95IYBdhLWcg3w8iv1#41577393 - rubo77
SQLite现在具有有限的ALTER功能:https://www.sqlite.org/lang_altertable.html - CAD bloke
5个回答

52

这是SQLite比较著名的缺点之一(即ALTER TABLE不支持MODIFY COLUMN),但它在SQLite未实现的SQL功能列表中。

编辑:已经更新了页面以表明可能在未来的版本中不再支持该功能,因此删除了有关可能在未来版本中支持的部分。


33

如果修改不是很大(例如更改varchar的长度),你可以导出数据库,手动编辑数据库定义,然后再次导入:

echo '.dump' | sqlite3 test.db > test.dump

然后用文本编辑器打开该文件,搜索要修改的定义,然后:

cat test.dump | sqlite3 new-test.db

1
在我的3BG家庭服务器上,有许多大表格,这需要100个小时来转储模式。难道没有一种方法可以仅从我的数据库中转储该表,然后在DB内删除它,再次插入更改后的表吗? - rubo77
在这种情况下,最好在数据库内完成所有操作:将表重命名为其他名称,创建新的表并按照所需格式进行设置,将所有数据从重命名的表复制到新表中,然后删除旧表。 - lmat - Reinstate Monica

13

正如这里所述,SQLite并没有实现这些功能。

另外,你可以通过使用带有select的create table来完成前两步:

CREATE TABLE tmp_table AS SELECT id, name FROM src_table

3
不错的技巧,这让我不必问“我如何改变表格中字段的顺序?” - SIFE
唯一能够使用侧边注释(感谢@SIFE)的情况是列重新排序。对于任何列定义更改,您仍然需要2个步骤:CREATE,INSERT。 参考:https://www.sqlite.org/lang_createtable.html - epox

1
当我运行“CREATE TABLE tmp_table AS SELECT id, name FROM src_table”时,我丢失了所有的列类型格式化(例如,时间字段变成了整数字段)。
最初似乎应该更容易解决这个问题,但以下是我解决问题的方法。我遇到了这个问题,因为我想在一个列中改变Not Null字段,而Sqlite在这方面并没有提供帮助。
使用'SQLite Manager' Firefox插件浏览器(使用你喜欢的工具)。我通过复制旧的创建语句来创建新表,进行修改,并执行它。然后为了复制数据,我只需将行高亮显示,右键点击“复制行(作为SQL)”,用我的表名替换“someTable”,并执行SQL。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接