从SQLite表中删除列

san*_*ndy 102 sql sqlite ddl

我有一个问题:我需要从我的SQLite数据库中删除一列.我写了这个查询

alter table table_name drop column column_name 
Run Code Online (Sandbox Code Playgroud)

但它不起作用.请帮我.

MeB*_*Guy 191

来自:http://www.sqlite.org/faq.html:

(11)如何在SQLite中添加或删除现有表中的列.

SQLite限制了ALTER TABLE支持,您可以使用该支持将列添加到表的末尾或更改表的名称.如果要在表的结构中进行更复杂的更改,则必须重新创建表.您可以将现有数据保存到临时表,删除旧表,创建新表,然后从临时表中复制数据.

例如,假设您有一个名为"t1"的表,其中列名为"a","b"和"c",并且您要从此表中删除列"c".以下步骤说明了如何完成此操作:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

  • +始终阅读SQLite文档.当你遇到错误时,你会发现SQL语法有太多的限制和差异.SQLite文档非常容易理解.别担心. (8认同)
  • FAQ 仍未更新,但您可以检查 ALTER TABLE 语法,其中已包含 DROP COLUMN 功能的描述:https://www.sqlite.org/lang_altertable.html#altertabdropcol (4认同)
  • 在删除安全列之后,您需要执行VACUUM命令; 没有吸尘,数据库文件仍包含已删除列的数据. (2认同)

Dud*_*uda 54

而不是删除备份表,只需重命名它...

BEGIN TRANSACTION;
CREATE TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
ALTER TABLE t1_backup RENAME TO t1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

  • 将foregin键连接到`t1`时,它将无法工作. (5认同)

小智 37

为简单起见,为什么不从select语句创建备份表?

CREATE TABLE t1_backup AS SELECT a, b FROM t1;
DROP TABLE t1;
ALTER TABLE t1_backup RENAME TO t1;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不保留主键,sqlite不支持更改表以添加主键.因此,如果主键很重要,那么这不是您应该使用的 (8认同)
  • 这种方法似乎保留了列的数据类型,而[接受的答案](/sf/answers/419148691/)似乎导致所有列都是"TEXT"类型. (3认同)
  • 这些语句也应包含在事务中. (2认同)
  • 这也不会保留NOT NULL. (2认同)

Mag*_*Tun 6

仅当您可以在数据库浏览器(如用于SQLite的数据库浏览器)中打开数据库时,此选项才有效。

在用于SQLite的数据库浏览器中:

  1. 转到标签“数据库结构”
  2. 选择您的表选择“修改”表(在选项卡下)
  3. 选择要删除的列
  4. 单击删除字段,然后单击确定