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

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

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


当前回答

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

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

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

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

其他回答

在挖掘中,我发现了这个多平台(Linux | Mac | Windows)图形化工具,称为DB Browser for SQLite,它实际上允许用户以一种非常用户友好的方式重命名列!

Edit | Modify Table |选中“Table | Edit Field”。点击点击!瞧!

然而,如果有人想分享一种程序化的方式来做这件事,我很乐意知道!

需要重命名一些表中的一些列

另一种方法是使用多个SQLite3命令来“重命名”列, 在“一些”表中,根据需要重复:

.output tmp

SELECT "ALTER TABLE """|| sqlite_master.name ||""" RENAME COLUMN old_name TO new_name;" FROM sqlite_master 
WHERE type = "table" AND sqlite_master.name NOT LIKE 'sqlite_%';

.read tmp

请注意,从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事务中封装所有这些;和提交;也可能是个好主意。

自版本2018-09-15 (3.25.0) Sqlite支持重命名列

https://sqlite.org/changes.html

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

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

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

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