joc*_*oce 286 sqlite alter-table
我需要在SQLite数据库的某些表中重命名几列.我知道之前在stackoverflow上已经提出了类似的问题,但它一般用于SQL,并且没有提到SQLite的情况.
从ALTER TABLE的SQLite文档中,我认为不可能"轻松"地做这样的事情(即单个ALTER TABLE语句).
我想知道有人知道用SQLite做这种事情的通用SQL方法.
Eva*_*van 442
假设您有一个表,需要将"colb"重命名为"col_b":
首先重命名旧表:
ALTER TABLE orig_table_name RENAME TO tmp_table_name;
Run Code Online (Sandbox Code Playgroud)
然后根据旧表创建新表,但使用更新的列名:
CREATE TABLE orig_table_name (
col_a INT
, col_b INT
);
Run Code Online (Sandbox Code Playgroud)
然后从原始表中复制内容.
INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;
Run Code Online (Sandbox Code Playgroud)
最后,放下旧桌子.
DROP TABLE tmp_table_name;
Run Code Online (Sandbox Code Playgroud)
将所有这些包装在一起BEGIN TRANSACTION;并且COMMIT;也可能是一个好主意.
joc*_*oce 55
四处搜索,我发现这个多平台(Linux | Mac | Windows)图形工具名为DB Browser for SQLite,它实际上允许用户以非常友好的方式重命名列!
编辑| 修改表| 选择表| 编辑字段.点击!瞧!
但是,如果有人想分享这样做的程序化方式,我很高兴知道!
Noa*_*oah 53
虽然确实没有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;
Run Code Online (Sandbox Code Playgroud)
您需要关闭并重新打开连接或清空数据库以将更改重新加载到架构中.
例如:
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
Run Code Online (Sandbox Code Playgroud)
参考资料如下:
alter table
SQLite支持ALTER TABLE的有限子集.SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列.无法重命名列,删除列,或从表中添加或删除约束.

Luk*_*zda 50
这只是在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;
Run Code Online (Sandbox Code Playgroud)
截至撰写时,Android的API 27正在使用SQLite包3.19版.
基于Android正在使用的当前版本以及此更新将在SQLite的3.25.0版本中出现,我会说您需要等待(大约是API 33),然后才能将此支持添加到Android.
即便如此,如果您需要支持任何早于API 33的版本,您将无法使用它.
aiz*_*ier 18
最近我不得不在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;
Run Code Online (Sandbox Code Playgroud)
我希望这对你有用!
Feb*_*hew 14
案例 1:SQLite 3.25.0+
只有 SQLite 3.25.0 版本支持重命名列。如果您的设备满足此要求,事情就很简单了。以下查询将解决您的问题:
ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";
Run Code Online (Sandbox Code Playgroud)
案例 2:SQLite 旧版本
您必须遵循不同的方法才能获得可能有点棘手的结果
例如,如果您有一个这样的表:
CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)
Run Code Online (Sandbox Code Playgroud)
如果您想更改列的名称 Location
步骤1:重命名原始表:
ALTER TABLE student RENAME TO student_temp;
Run Code Online (Sandbox Code Playgroud)
第 2 步:现在创建一个student具有正确列名的新表:
CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)
Run Code Online (Sandbox Code Playgroud)
第三步:将原表中的数据复制到新表中:
INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;
Run Code Online (Sandbox Code Playgroud)
注意:上面的命令应该都是一行。
第 4 步:删除原始表:
DROP TABLE student_temp;
Run Code Online (Sandbox Code Playgroud)
通过这四个步骤,您可以手动更改任何 SQLite 表。请记住,您还需要在新表上重新创建任何索引、查看器或触发器。
首先,这是让我惊讶的事情之一:重命名列需要创建一个全新的表并将数据从旧表复制到新表...
我已经着手进行SQLite操作的GUI是Base.它有一个漂亮的日志窗口,显示已执行的所有命令.通过Base重命名列会使用必要的命令填充日志窗口:

然后可以轻松地将它们复制并粘贴到您可能需要的位置.对我来说,这是一个ActiveAndroid迁移文件.同样好的一点是,复制的数据只包括SQLite命令,而不包括时间戳等.
希望这能节省一些人的时间.
| 归档时间: |
|
| 查看次数: |
168393 次 |
| 最近记录: |