我需要在SQLite数据库的某些表中重命名几列.我知道之前在stackoverflow上已经提出了类似的问题,但它一般用于SQL,并且没有提到SQLite的情况.
从ALTER TABLE的SQLite文档中,我认为不可能"轻松"地做这样的事情(即单个ALTER TABLE语句).
我想知道有人知道用SQLite做这种事情的通用SQL方法.
假设您有一个表,需要将"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;
也可能是一个好主意.
四处搜索,我发现这个多平台(Linux | Mac | Windows)图形工具名为DB Browser for SQLite,它实际上允许用户以非常友好的方式重命名列!
编辑| 修改表| 选择表| 编辑字段.点击!瞧!
但是,如果有人想分享这样做的程序化方式,我很高兴知道!
虽然确实没有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
参考资料如下:
alter table
SQLite支持ALTER TABLE的有限子集.SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列.无法重命名列,删除列,或从表中添加或删除约束.
这只是在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的API 27正在使用SQLite包3.19版.
基于Android正在使用的当前版本以及此更新将在SQLite的3.25.0版本中出现,我会说您需要等待(大约是API 33),然后才能将此支持添加到Android.
即便如此,如果您需要支持任何早于API 33的版本,您将无法使用它.
最近我不得不在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命令允许用户重命名表或向现有表添加新列.无法重命名列,删除列,或从表中添加或删除约束.
您当然可以做的是,使用新布局创建一个新表SELECT * FROM old_table
,并使用您将收到的值填充新表.
首先,这是让我惊讶的事情之一:重命名列需要创建一个全新的表并将数据从旧表复制到新表...
我已经着手进行SQLite操作的GUI是Base.它有一个漂亮的日志窗口,显示已执行的所有命令.通过Base重命名列会使用必要的命令填充日志窗口:
然后可以轻松地将它们复制并粘贴到您可能需要的位置.对我来说,这是一个ActiveAndroid迁移文件.同样好的一点是,复制的数据只包括SQLite命令,而不包括时间戳等.
希望这能节省一些人的时间.