当前位置:  开发笔记 > 前端 > 正文

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

如何解决《如何重命名SQLite数据库表中的列?》经验,为你挑选了7个好方法。

我需要在SQLite数据库的某些表中重命名几列.我知道之前在stackoverflow上已经提出了类似的问题,但它一般用于SQL,并且没有提到SQLite的情况.

从ALTER TABLE的SQLite文档中,我认为不可能"轻松"地做这样的事情(即单个ALTER TABLE语句).

我想知道有人知道用SQLite做这种事情的通用SQL方法.



1> Evan..:

假设您有一个表,需要将"colb"重命名为"col_b":

首先重命名旧表:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

然后根据旧表创建新表,但使用更新的列名:

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;并且COMMIT;也可能是一个好主意.


不要忘记你的指数.
SQLite的`.schema`命令很方便显示创建现有表的`CREATE TABLE`语句.您可以获取其输出,根据需要进行修改,然后执行它以创建新表.此命令还显示了创建索引所必需的`CREATE INDEX`命令,这些命令应该涵盖Thomas的问题.当然,请务必在更改任何内容之前运行此命令.
非常重要的是,上面的示例代码缺少一个事务.您应该将整个事物包装在BEGIN/END(或ROLLBACK)中以确保重命名成功完成或根本不完成.
答案中的代码中没有任何内容可以复制索引.创建一个空表并将数据放入其中只会复制结构和数据.如果您需要元数据(索引,外键,约束等),那么您还必须发出语句以在替换表上创建它们.
任何希望在android中执行此操作的人都可以使用[SQLiteDatabase.beginTransaction()]实现事务(http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#beginTransaction%28%29)
@ ThomasG.Mayfield我对指数评论感到困惑.是不是像所有其他未重命名的列一样逐字复制索引?

2> joce..:

四处搜索,我发现这个多平台(Linux | Mac | Windows)图形工具名为DB Browser for SQLite,它实际上允许用户以非常友好的方式重命名列!

编辑| 修改表| 选择表| 编辑字段.点击!瞧!

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



3> Noah..:

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

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

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;

您需要关闭并重新打开连接或清空数据库以将更改重新加载到架构中.

例如:

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  

参考资料如下:


pragma writable_schema
启用此pragma时,可以使用普通的UPDATE,INSERT和DELETE语句更改数据库的SQLITE_MASTER表.警告:滥用此pragma很容易导致数据库文件损坏.

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

ALTER TABLE SYNTAX


sqlite文件格式非常简单,这就是此操作有效的原因.文件格式只有两组有关表的信息:实际的CREATE TABLE命令为纯文本,以及行,其值按CREATE命令的字段顺序出现.这意味着sqlite代码打开数据库,它解析每个CREATE命令并在内存中动态构建其列信息.因此,即使您更改了类型或约束,任何以最终具有相同数量的列的方式更改CREATE命令的命令都将起作用.
危险,但仍然可能是最直接的答案imo.
@ThomasTempelmann但是,添加数据集未满足的约束会产生问题,因为查询计划程序假定约束成立.
是非常快 - *危险*仅表示"确保您先备份"
@ThomasTempelmann*删除*约束总是很好.*如果所有行都满足约束但是你肯定需要检查,那么添加*约束就可以了.

4> Lukasz Szozd..:

这只是在2018-09-15(3.25.0)修复

增强ALTER TABLE命令:

添加对使用ALTER TABLE表重命名表中列的支持RENAME COLUMN oldname TO newname.

修复表重命名功能,以便它还更新对触发器和视图中重命名的表的引用.

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

RENAME COLUMN TO语法修改表的表名的列名到新的列名称.列名称在表定义本身内以及引用该列的所有索引,触发器和视图中都会更改.如果列名称更改将导致触发器或视图中出现语义歧义,则RENAME COLUMN失败并显示错误且不应用任何更改.

在此输入图像描述 图片来源:https://www.sqlite.org/images/syntax/alter-table-stmt.gif

例:

CREATE TABLE tab AS VALUES(1);

SELECT * FROM tab;

ALTER TABLE tab RENAME TO tab_new;

SELECT * FROM tab_new;

db-fiddle.com演示


Android支持

截至撰写时,Android的API 27正在使用SQLite包3.19版.

基于Android正在使用的当前版本以及此更新将在SQLite的3.25.0版本中出现,我会说您需要等待(大约是API 33),然后才能将此支持添加到Android.

即便如此,如果您需要支持任何早于API 33的版本,您将无法使用它.


我正在实现Android迁移,不幸的是IntelliJ正在显示它不是有效的SQL命令的警告.`database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")`.**COLUM**以红色突出显示*表示*TO预期,得到'COLUMN'*.不幸的是Android仍然在SQLite版本**3.19**,这就是为什么这对我不起作用.
我为Android支持添加了一个部分,以防止其他人抱有希望。根据Android 27当前对SQLite 3.19的使用情况,我们必须等到大约API 33才能将此功能添加到Android,即使那样,它也仅在最新版本中受支持。叹。

5> aizquier..:

最近我不得不在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;

我希望这对你有用!


做"UPDATE points SET lon = lat,lat = lon;"会不会更容易?

6> Elazar Leibo..:

引用sqlite文档:

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

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



7> Joshua Pinte..:

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

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

基本日志窗口

然后可以轻松地将它们复制并粘贴到您可能需要的位置.对我来说,这是一个ActiveAndroid迁移文件.同样好的一点是,复制的数据只包括SQLite命令,而不包括时间戳等.

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

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有