2010-04-21 74 views
38

我需要修改SQLite数据库中的列,但是我必须以编程方式执行,因为数据库已在生产中。从我的研究中,我发现为了做到这一点,我必须做到以下几点。SQLite修改列

  • 新模式创建一个新的表从旧表到新表
  • 复制数据
  • 删除旧表
  • 重命名新表,旧表命名

这似乎是一个对于那些应该相对容易的事情来说,可笑的工作量是很可观的。有没有更简单的方法?我需要做的就是改变现有列的约束并给它一个默认值。

+0

的[修改列在sqlite3的类型]可能的复制(http://stackoverflow.com/questions/2083543/modify-a-columns -type-in​​-sqlite3) – rubo77 2017-01-10 20:01:39

+0

我在这里创建了一个脚本来重命名表中的一个字段。 http://stackoverflow.com/a/41577393/1069083 – rubo77 2017-01-10 20:04:28

回答

39

这是SQLite的(在ALTER TABLE没有MODIFY COLUMN支持)的较知名的缺点之一,但它的在list of SQL features that SQLite does not implement

编辑:即提到,可能在将来的版本所支持的页面进行了更新,以表明删除位不再的情况下

7

正如所说的here,这些功能不是由SQLite实现的。

作为一个侧面说明,你可以做一个创建表的两个第一步骤,选择:

​​
+3

好戏,这让我不再问“我怎样才能改变表中的字段顺序?”。 – SIFE 2013-03-03 14:37:43

+0

附注工作的唯一情况(感谢@SIFE)是一个列重新排序。对于任何列def更改,您仍然需要2个步骤:CREATE,INSERT。 ref:https://www.sqlite.org/lang_createtable.html – epox 2017-11-19 22:19:58

1

当我跑了“CREATE TABLE tmp_table的AS SELECT ID,名字从src_table” ,我失去了所有的列类型格式(例如,时间字段变成了一个整数字段

正如最初所述似乎应该更容易,但这是我做了什么来解决。我有这个问题B/C我想要更改列中的非空字段,并且Sqlite不会真的有帮助。

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

19

如果修改不是太大(例如,改变一个varchar的长度),你可以转储数据库,手动编辑数据库定义,然后再返回导入:

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

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

cat test.dump | sqlite3 new-test.db 
+0

在我的3BG homeserver.db中有很多大表,这需要100个小时来转储shema。是不是有办法从我的数据库中只转储一个表,在数据库中删除它,然后再次插入已更改的表? – rubo77 2017-01-10 19:08:07