SQLite中的ALTER COLUMN


80

如何更改sqlite中的列?这是在Postgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

我相信sqlite中根本没有ALTER COLUMN,仅支持ALTER TABLE。

任何的想法?谢谢!


您要求使用ALTER COLUMN语法,但是您没有说要做什么。这使我认为这太广泛了。ALTER COLUMN可以做很多事情,您是否希望像pg示例中那样删除not null约束?
埃文·卡洛尔

如果您使用的是intellj db工具,则在更改列时,它将为sqlite生成命令。
foolcage

Answers:



64

的确不是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**  

参考如下:


pragma writable_schema
启用此pragma时,可以使用普通的UPDATE,INSERT和DELETE语句在其中更改数据库的SQLITE_MASTER表。警告:滥用该编译指示很容易导致数据库文件损坏。

[ALTER TABLE](来自http://www.sqlite.org/lang_altertable.html
SQLite支持ALTER TABLE的有限子集。SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。无法重命名列,删除列或从表中添加或删除约束。

更改表语法


7
此方法对我有用,尽管是为了避免列的顺序可能不同(例如,与上一个ADD COLUMN命令的顺序不同),但我使用了:UPDATE SQLITE_MASTER SET SQL = replace(SQL,'[[MyColumn] integer integer NOT NULL' ,'[[MyColumn] integer NULL'),WHERE NAME ='MyTable'。另外,请注意不要将其作为事务的一部分运行-这可能会阻止某些较早的事务命令运行。
罗斯,

32

SQLite支持ALTER TABLE的有限子集。SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。无法重命名列,删除列或从表中添加或删除约束。但是您可以通过以下步骤更改表列数据类型或其他属性。

  1. 开始交易;
  2. 创建临时表t1_backup(a,b);
  3. 插入t1_backup从t1中选择a,b;
  4. 删除表t1;
  5. 创建表t1(a,b);
  6. 从t1_backup插入t1 SELECT a,b;
  7. 删除表t1_backup;
  8. 承诺

有关更多详细信息,请参考链接


重命名表:ALTER TABLE table1 RENAME TO table2;
live-love

不要忘记索引。运行.schema以生成带有索引的create语句。
现场直播
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.