我需要重命名SQLite数据库中一些表中的一些列。 我知道以前有人在stackoverflow上问过类似的问题,但这是针对一般的SQL,没有提到SQLite的情况。

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

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


当前回答

一种选择是,如果你需要在紧要时刻完成它,如果你的初始列是用默认创建的,那就创建你想要的新列,将内容复制到它,然后基本上“放弃”旧列(它仍然存在,但你只是不使用/更新它,等等)。

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命令允许用户重命名表或向现有表添加新列。不能重命名列、删除列或从表中添加或删除约束。

在挖掘中,我发现了这个多平台(Linux | Mac | Windows)图形化工具,称为DB Browser for SQLite,它实际上允许用户以一种非常用户友好的方式重命名列!

Edit | Modify Table |选中“Table | Edit Field”。点击点击!瞧!

然而,如果有人想分享一种程序化的方式来做这件事,我很乐意知道!

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

我希望这对你有用!

一种选择是,如果你需要在紧要时刻完成它,如果你的初始列是用默认创建的,那就创建你想要的新列,将内容复制到它,然后基本上“放弃”旧列(它仍然存在,但你只是不使用/更新它,等等)。

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创建的,但没有默认值,那么未来的插入可能会忽略它),但如果它只是一个丢弃的表,那么折衷可能是可以接受的。否则,请使用这里提到的其他答案之一,或者使用允许重命名列的不同数据库。

创建一个具有所需列名的新列:COLNew。

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

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

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

注:以上一行必须使用括号。