需要一个好的方法来改变(SQLite)列数据类型

时间:2012-04-14 17:38:39

标签: android sqlite

我正在使用'int'列的表。在软件升级期间,我想将其更改为“长”数据类型。似乎SQLite没有提供更改/修改列属性的选项(在alter语句中)。由于我想进行升级,因此该表可能包含用户不应丢失的数据。所以请建议我一个很好的方法来更改列数据类型属性而不会丢失数据。

搜索链接中建议的一种方法是创建临时表,从现有表中复制记录,删除现有表,以及重命名临时表。我怀疑这是否有效。

您的帮助表示赞赏!

此致

Vivek Ragunathan

5 个答案:

答案 0 :(得分:12)

我使用了以下语句来更改列的类型。

CREATE TABLE IF NOT EXISTS **TEMP_TABLE** (id integer primary key autoincrement, **col2change integer not null**, ...)

INSERT INTO TEMP_TABLE SELECT * FROM EXISTING_TABLE

DROP TABLE EXISTING_TABLE

ALTER TABLE TEMP_TABLE RENAME TO EXISTING_TABLE

我将现有表中的int类型列更改为整数类型。几百行,速度相当快。

答案 1 :(得分:3)

SQLite3列没有数据类型,只有affinities - 将列类型从int更改为long没有任何好处。

如果包装程序在将值提供给SQLite3之前截断值,则可以通过编辑模式来解决此问题。这是一个危险的操作,所以只有在备份数据库之后才这样做。架构存储在表sqlite_master中;通常它是只读的,但如果使用writable_schema pragma启用它,则可以修改它。小心只进行不会使数据无效的更改;您可以将int更改为long int,因为它们都具有INTEGER亲和力。

答案 2 :(得分:1)

来自SQLite文档

  

无法重命名列,删除列或添加或   从表中删除约束。

Check this link

请记住,SQLite中的列数据类型并不严格。 Check this link

修改 在你对另一个答案的评论之后,我想你提到的选项 - 通过临时表 - 是唯一一个,当然效率不高。

答案 3 :(得分:0)

您可以添加新列,将值从旧列复制到新列,删除旧列,然后将新列重命名为旧列

答案 4 :(得分:0)

AFAIK在创建和使用表格后,Android中有方式更改列数据类型。实践的方法是制作一个新表并复制您阅读的数据