5

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

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

感谢您的帮助!

问候

维维克·拉古纳坦

4

5 回答 5

13

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

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 类型列更改为整数类型。对于几百行,它相当快。

于 2012-04-16T16:17:52.320 回答
3

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

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

于 2012-04-14T17:45:19.930 回答
1

来自 SQLite 文档

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

检查此链接

请记住,列数据类型在 SQLite 中并不严格。检查此链接

编辑: 根据您对另一个答案的评论,我猜您提到的选项 - 通过临时表工作 - 是唯一的选项,这在课程之外效率不高。

于 2012-04-14T17:47:06.343 回答
0

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

于 2012-04-14T17:44:07.070 回答
0

AFAIK一旦创建和使用表,Android 就无法更改列数据类型实践的方法是创建一个新表并复制您阅读的数据

于 2012-04-14T17:44:18.360 回答