52

I need to modify a column in a SQLite database but I have to do it programatically due to the database already being in production. From my research I have found that in order to do this I must do the following.

  • Create a new table with new schema
  • Copy data from old table to new table
  • Drop old table
  • Rename new table to old tables name

That seems like a ridiculous amount of work for something that should be relatively easy. Is there not an easier way? All I need to do is change a constraint on a existing column and give it a default value.

4

5 回答 5

47

这是 SQLite 众所周知的缺点之一(不MODIFY COLUMN支持ALTER TABLE),但它在SQLite 未实现的 SQL 功能列表中

编辑:删除了提到它可能在未来版本中受支持的位,因为页面已更新以表明不再是这种情况

于 2010-04-21T19:20:20.023 回答
28

如果修改不是太大(例如更改 varchar 的长度),您可以转储数据库,手动编辑数据库定义并再次将其导入:

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

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

cat test.dump | sqlite3 new-test.db
于 2012-04-30T14:50:43.700 回答
10

正如这里所说,这些特性不是由 SQLite 实现的。

作为旁注,您可以使用带有选择的创建表来完成您的两个第一步:

CREATE TABLE tmp_table AS SELECT id, name FROM src_table
于 2010-04-21T19:19:50.987 回答
1

当我运行“CREATE TABLE tmp_table AS SELECT id, name FROM src_table”时,我丢失了所有列类型格式(例如,时间字段变成了整数字段

正如最初所说的那样似乎应该更容易,但这是我所做的修复。我遇到了这个问题 b/c 我想更改列中的 Not Null 字段,而 Sqlite 在那里并没有真正的帮助。

使用 'SQLite Manager' Firefox 插件浏览器(使用你喜欢的)。我通过复制旧的 create 语句创建了新表,进行了修改并执行了它。然后为了复制数据,我只是突出显示了行,R-单击“将行复制为 SQL”,将“someTable”替换为我的表名,然后执行 SQL。

于 2011-01-11T18:23:18.273 回答
0

已经对这个问题给出了各种很好的答案,但我也建议查看sqlite.org 页面,ALTER TABLE该页面详细介绍了这个问题:哪些(很少)更改可能对列(RENAME| ADD| DROP)以及其他的详细解决方法为什么 ALTER TABLE 对 SQLite 来说是这样一个问题中进行其他类型的表架构更改和背景信息部分中的操作。特别是解决方法指出了在处理更复杂的表时的一些陷阱,并解释了如何安全地进行更改。

于 2022-01-28T20:42:13.317 回答