在sqlite中的ALTER COLUMN

时间:2010-10-24 03:17:21

标签: sqlite

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

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

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

有什么想法吗?谢谢!

5 个答案:

答案 0 :(得分:96)

sqlite中没有ALTER COLUMN。

我相信你唯一的选择是:

  • 将表重命名为临时名称
  • 创建没有NOT NULL约束的新表
  • 将旧表格的内容复制到新表格
  • 删除旧表

This other Stackoverflow answer详细解释了该过程

答案 1 :(得分:61)

虽然确实没有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表。警告:滥用此pragma很容易导致数据库文件损坏。

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

ALTER TABLE SYNTAX

答案 2 :(得分:30)

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

  1. BEGIN TRANSACTION;
  2. CREATE TEMPORARY TABLE t1_backup(a,b);
  3. INSERT INTO t1_backup SELECT a,b FROM t1;
  4. DROP TABLE t1;
  5. 创建表t1(a,b);
  6. INSERT INTO t1 SELECT a,b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. COMMIT
  9. 有关详细信息,请参阅link

答案 3 :(得分:1)

ALTER COLUMNSQLite 中不存在。

仅支持更改操作:

  • 更改表名
  • 更改表列名称
  • 添加新列
  • 下拉列

Alex Jasmin's answer shows possible way

参考:

答案 4 :(得分:0)

  1. 创建表 temp_Table(x,y[,etc]);

  2. INSERT INTO temp_Table SELECT * FROM Table;

  3. DROP TABLE 表;

  4. ALTER TABLE temp_Table RENAME TO Table;

谢谢你帮我找到了一个确定的方法!