如何重命名SQLite数据库表中的列?

我需要重新命名SQLite数据库中某些表中的几列。 我知道一个类似的问题已经被问到以前的stackoverflow,但它是一般的SQL,并没有提到SQLite的情况。

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

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

假设你有一张桌子,需要将“colb”重命名为“col_b”:

首先你重命名旧表:

ALTER TABLE orig_table_name RENAME TO tmp_table_name; 

然后根据旧表格但使用更新的列名称创build新表格:

 CREATE TABLE orig_table_name ( col_a INT , col_b INT ); 

然后从原始表中复制内容。

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

最后,放下旧桌子。

 DROP TABLE tmp_table_name; 

BEGIN TRANSACTION;包装所有这些BEGIN TRANSACTION;COMMIT; 也可能是一个好主意。

虽然确实没有ALTER COLUMN,但如果只想重命名列,删除NOT NULL约束或更改数据types,则可以使用以下命令集:

注意:这些命令有可能损坏您的数据库,因此请确保您有备份

 PRAGMA writable_schema = 1; UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS'; PRAGMA writable_schema = 0; 

您将需要closures并重新打开连接,或者抽空数据库以将更改重新加载到模式中。

例如:

 Y:\> sqlite3 booktest SQLite version 3.7.4 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL); sqlite> insert into BOOKS VALUES ("NULLTEST",null); Error: BOOKS.publication_date may not be NULL sqlite> PRAGMA writable_schema = 1; sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS'; sqlite> PRAGMA writable_schema = 0; sqlite> .q Y:\> sqlite3 booktest SQLite version 3.7.4 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> insert into BOOKS VALUES ("NULLTEST",null); sqlite> .q 

参考资料如下:


编译指示writeable_schema
当此编译指示打开时,可使用普通UPDATE,INSERT和DELETE语句更改数据库的SQLITE_MASTER表。 警告:误用这个编译指示很容易导致数据库文件损坏。

改变表格
SQLite支持ALTER TABLE的有限子集。 SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。 不能重命名列,删除列或添加或删除表中的约束。

改变表格语法

挖掘,我发现这个多平台(Linux | Mac | Windows)graphics工具称为数据库浏览器的SQLite ,实际上允许一个非常用户友好的方式重命名列!

编辑| 修改表格| select表格| 编辑字段。 点击点击! 瞧!

但是,如果有人想分享这样做的程序化方式,我很乐意知道!

最近我不得不在SQLite3中用一个名为points的表与colunms id,lon,lat做到这一点。 错误的是,当表格导入时, lon列中存储的纬度值反之亦然,因此显而易见的修复将是重命名这些列。 所以诀窍是:

 create table points_tmp as select id, lon as lat, lat as lon from points; drop table points; alter table points_tmp rename to points; 

我希望这会对你有用!

引用sqlite文档 :

SQLite支持ALTER TABLE的有限子集。 SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。 无法重命名列,删除列或添加或删除表中的约束。

你当然可以做的是,用新的布局创build一个新的表, SELECT * FROM old_table ,并用你将要接收到的值填充新表。

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

我已经着手做SQLite操作的GUI是Base 。 它有一个漂亮的日志窗口,显示所有已执行的命令。 通过Base对列进行重命名将填充必要命令的日志窗口:

基本日志窗口

这些可以很容易地复制和粘贴在你可能需要的地方。 对我来说,这是一个ActiveAndroid迁移文件。 一个很好的触摸,复制的数据只包含SQLite命令,而不是时间戳等。

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

将表列<id>更改为<_id>

  String LastId = "id"; database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old"); database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME +"(" + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY," + PhraseContract.COLUMN_PHRASE + " text ," + PhraseContract.COLUMN_ORDER + " text ," + PhraseContract.COLUMN_FROM_A_LANG + " text" +")" ); database.execSQL("INSERT INTO " + PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" + " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG + " FROM " + PhraseContract.TABLE_NAME + "old"); database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old"); 

如前所述,有一个工具SQLite数据库浏览器,这是做到这一点。 很简单,这个工具会logging用户或应用程序执行的所有操作。 这样做一次,看看应用程序日志,你会看到涉及的代码。 复制查询并根据需要粘贴。 为我工作。 希望这可以帮助

一个选项,如果你需要它在一个捏,而如果你的初始列创build一个默认的,是创build你想要的新列,复制到它的内容,基本上“放弃”旧列(它保持目前,但你只是不使用/更新,等等)

例如:

 alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT ''; update TABLE_NAME set new_column_name = old_column_name; update TABLE_NAME set old_column_name = ''; -- abandon old column, basically 

这留下了一个列(如果它是用NOT NULL创build的,但是没有默认值,那么将来的插入忽略它可能会失败),但是如果它只是一次性表,那么折中可能是可以接受的。 否则,请使用此处提及的其他答案之一,或使用允许重命名列的其他数据库。

用所需的列名创build一个新列:COLNew。

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

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

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

注意:括号在上面的行是必要的。

sqlite3 yourdb .dump> /tmp/db.txt
编辑/tmp/db.txt更改创build行中的列名称
sqlite2 yourdb2 </tmp/db.txt
mv /移动你的db2 yourdb