我需要修改SQLite数据库中的列,但是我必须以编程方式执行,因为数据库已在生产中。从我的研究中,我发现为了做到这一点,我必须做到以下几点。SQLite修改列
- 新模式创建一个新的表从旧表到新表
- 复制数据
- 删除旧表
- 重命名新表,旧表命名
这似乎是一个对于那些应该相对容易的事情来说,可笑的工作量是很可观的。有没有更简单的方法?我需要做的就是改变现有列的约束并给它一个默认值。
我需要修改SQLite数据库中的列,但是我必须以编程方式执行,因为数据库已在生产中。从我的研究中,我发现为了做到这一点,我必须做到以下几点。SQLite修改列
这似乎是一个对于那些应该相对容易的事情来说,可笑的工作量是很可观的。有没有更简单的方法?我需要做的就是改变现有列的约束并给它一个默认值。
这是SQLite的(在ALTER TABLE
没有MODIFY COLUMN
支持)的较知名的缺点之一,但它的在list of SQL features that SQLite does not implement。
编辑:即提到,可能在将来的版本所支持的页面进行了更新,以表明删除位不再的情况下
当我跑了“CREATE TABLE tmp_table的AS SELECT ID,名字从src_table” ,我失去了所有的列类型格式(例如,时间字段变成了一个整数字段
正如最初所述似乎应该更容易,但这是我做了什么来解决。我有这个问题B/C我想要更改列中的非空字段,并且Sqlite不会真的有帮助。
使用'SQLite管理器' Firefox插件浏览器(使用你喜欢的)。我通过复制旧的create语句创建了新表,进行了修改并执行了它。然后为了获取复制的数据,我只突出显示了行,然后单击“将行复制为SQL”,用我的表名替换“someTable”,然后执行SQL。
如果修改不是太大(例如,改变一个varchar的长度),你可以转储数据库,手动编辑数据库定义,然后再返回导入:
echo '.dump' | sqlite3 test.db > test.dump
然后打开该文件一个文本编辑器,搜索要修改,然后定义:
cat test.dump | sqlite3 new-test.db
在我的3BG homeserver.db中有很多大表,这需要100个小时来转储shema。是不是有办法从我的数据库中只转储一个表,在数据库中删除它,然后再次插入已更改的表? – rubo77 2017-01-10 19:08:07
的[修改列在sqlite3的类型]可能的复制(http://stackoverflow.com/questions/2083543/modify-a-columns -type-in-sqlite3) – rubo77 2017-01-10 20:01:39
我在这里创建了一个脚本来重命名表中的一个字段。 http://stackoverflow.com/a/41577393/1069083 – rubo77 2017-01-10 20:04:28