我需要重命名SQLite数据库中一些表中的一些列。 我知道以前有人在stackoverflow上问过类似的问题,但这是针对一般的SQL,没有提到SQLite的情况。
从ALTER TABLE的SQLite文档中,我收集到不可能“轻松”地做这样的事情(即一个ALTER TABLE语句)。
我想知道有人知道一个通用的SQL方法做这样的事情与SQLite。
我需要重命名SQLite数据库中一些表中的一些列。 我知道以前有人在stackoverflow上问过类似的问题,但这是针对一般的SQL,没有提到SQLite的情况。
从ALTER TABLE的SQLite文档中,我收集到不可能“轻松”地做这样的事情(即一个ALTER TABLE语句)。
我想知道有人知道一个通用的SQL方法做这样的事情与SQLite。
当前回答
首先,这是那些让我吃惊的事情之一:重命名一个列需要创建一个全新的表,并将数据从旧表复制到新表……
我用来执行SQLite操作的GUI是Base。它有一个漂亮的日志窗口,显示所有已执行的命令。通过Base重命名列会用必要的命令填充日志窗口:
然后可以很容易地复制和粘贴到您可能需要的地方。对我来说,这是一个ActiveAndroid迁移文件。还有一个不错的地方,复制的数据只包括SQLite命令,不包括时间戳等。
希望这能节省一些人的时间。
其他回答
最近我不得不在SQLite3中使用一个名为points的表,列为id lon lat。错误地,当导入表时,latitude的值存储在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;
我希望这对你有用!
虽然确实没有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命令允许用户重命名表或向现有表添加新列。不能重命名列、删除列或从表中添加或删除约束。
案例1:SQLite 3.25.0+
只有SQLite的3.25.0版本支持重命名列。如果你的设备满足这个要求,事情就很简单了。下面的查询可以解决你的问题:
ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";
案例2:SQLite旧版本
你必须遵循不同的方法来得到结果,这可能有点棘手
例如,如果你有一个这样的表:
CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)
如果您希望更改列Location的名称
步骤1:重命名原始表:
ALTER TABLE student RENAME TO student_temp;
步骤2:现在用正确的列名创建一个新表student:
CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)
步骤3:将原表中的数据复制到新表中:
INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;
注意:上面的命令应该是一行。
步骤4:删除原来的表:
DROP TABLE student_temp;
通过这四个步骤,您可以手动更改任何SQLite表。 请记住,您还需要在新表上重新创建索引、查看器或触发器。
自版本2018-09-15 (3.25.0) Sqlite支持重命名列
https://sqlite.org/changes.html
创建一个具有所需列名的新列:COLNew。
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
将旧列COLOld的内容复制到新列COLNew。
INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}
注:以上一行必须使用括号。