我需要重命名SQLite数据库中一些表中的一些列。 我知道以前有人在stackoverflow上问过类似的问题,但这是针对一般的SQL,没有提到SQLite的情况。

从ALTER TABLE的SQLite文档中,我收集到不可能“轻松”地做这样的事情(即一个ALTER TABLE语句)。

我想知道有人知道一个通用的SQL方法做这样的事情与SQLite。


当前回答

首先,这是那些让我吃惊的事情之一:重命名一个列需要创建一个全新的表,并将数据从旧表复制到新表……

我用来执行SQLite操作的GUI是Base。它有一个漂亮的日志窗口,显示所有已执行的命令。通过Base重命名列会用必要的命令填充日志窗口:

然后可以很容易地复制和粘贴到您可能需要的地方。对我来说,这是一个ActiveAndroid迁移文件。还有一个不错的地方,复制的数据只包括SQLite命令,不包括时间戳等。

希望这能节省一些人的时间。

其他回答

创建一个具有所需列名的新列:COLNew。

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

将旧列COLOld的内容复制到新列COLNew。

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

注:以上一行必须使用括号。

引用sqlite文档:

SQLite支持的有限子集 ALTER TABLE。ALTER TABLE命令 在SQLite中允许用户重命名 表或添加新列到 现有的表。不能重命名列、删除列或从表中添加或删除约束。

当然,您可以用新的布局创建一个新表,SELECT * FROM old_table,并用您将收到的值填充新表。

此问题已在2018-09-15(3.25.0)中修复

增强ALTER TABLE命令: 增加了使用ALTER table table RENAME COLUMN oldname TO newname重命名表中的列的支持。 修复表重命名特性,以便在触发器和视图中更新对重命名表的引用。

您可以在ALTER TABLE下面找到新的语法文档

RENAME COLUMN TO语法将表table-name的COLUMN -name更改为new-column-name。在表定义本身以及引用该列的所有索引、触发器和视图中更改列名。如果列名更改将导致触发器或视图中的语义歧义,则RENAME column将失败并报错,并且不会应用任何更改。

图片来源:https://www.sqlite.org/images/syntax/alter-table-stmt.gif

例子:

CREATE TABLE tab AS SELECT 1 AS c;

SELECT * FROM tab;

ALTER TABLE tab RENAME COLUMN c to c_new;

SELECT * FROM tab;

db-fiddle.com演示


Android支持

在撰写本文时,Android的API 27正在使用SQLite包3.19版本。

基于Android正在使用的当前版本,这个更新将在SQLite的3.25.0版本中发布,我想说的是,在Android添加此支持之前,您需要等待(大约API 33)。

而且,即使这样,如果你需要支持任何比API 33更老的版本,你也不能使用这个。

请注意,从2018年9月发布的3.25.0版本开始,您现在可以使用ALTER TABLE重命名列。

原来“创建新表和删除旧表”的答案如下。


假设你有一个表,需要将“colb”重命名为“col_b”:

首先创建一个临时名称的新表,该名称基于旧表定义,但使用了更新的列名:

CREATE TABLE tmp_table_name (
  col_a INT
, col_b INT
);

然后从原始表复制内容。

INSERT INTO tmp_table_name(col_a, col_b)
SELECT col_a, colb
FROM orig_table_name;

放下旧桌子。

DROP TABLE orig_table_name;

最后将临时表重命名为原来的表:

ALTER TABLE tmp_table_name RENAME TO orig_table_name;

不要忘记重新创建索引、触发器等。文档更全面地描述了这些陷阱和注意事项。

在BEGIN事务中封装所有这些;和提交;也可能是个好主意。

如前所述,有一个工具SQLite数据库浏览器,它可以做到这一点。Lyckily,这个工具保存用户或应用程序执行的所有操作的日志。执行此操作一次并查看应用程序日志,您将看到所涉及的代码。复制查询并根据需要粘贴。为我工作。希望这能有所帮助