我需要重命名SQLite数据库中一些表中的一些列。 我知道以前有人在stackoverflow上问过类似的问题,但这是针对一般的SQL,没有提到SQLite的情况。
从ALTER TABLE的SQLite文档中,我收集到不可能“轻松”地做这样的事情(即一个ALTER TABLE语句)。
我想知道有人知道一个通用的SQL方法做这样的事情与SQLite。
我需要重命名SQLite数据库中一些表中的一些列。 我知道以前有人在stackoverflow上问过类似的问题,但这是针对一般的SQL,没有提到SQLite的情况。
从ALTER TABLE的SQLite文档中,我收集到不可能“轻松”地做这样的事情(即一个ALTER TABLE语句)。
我想知道有人知道一个通用的SQL方法做这样的事情与SQLite。
当前回答
此问题已在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-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更老的版本,你也不能使用这个。
一种选择是,如果你需要在紧要时刻完成它,如果你的初始列是用默认创建的,那就创建你想要的新列,将内容复制到它,然后基本上“放弃”旧列(它仍然存在,但你只是不使用/更新它,等等)。
ex:
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创建的,但没有默认值,那么未来的插入可能会忽略它),但如果它只是一个丢弃的表,那么折衷可能是可以接受的。否则,请使用这里提到的其他答案之一,或者使用允许重命名列的不同数据库。
虽然确实没有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
引用: 编译指示writable_schema 当打开此pragma时,数据库所在的SQLITE_MASTER表可以使用普通的UPDATE、INSERT和DELETE语句进行更改。警告:误用此pragma很容易导致数据库文件损坏。
alter table SQLite支持ALTER TABLE的一个有限子集。SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。不能重命名列、删除列或从表中添加或删除约束。
请注意,从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,这个工具保存用户或应用程序执行的所有操作的日志。执行此操作一次并查看应用程序日志,您将看到所涉及的代码。复制查询并根据需要粘贴。为我工作。希望这能有所帮助