在sqlite中的ALTER COLUMN

Cpp*_*ner 73 sqlite

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

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
Run Code Online (Sandbox Code Playgroud)

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

任何的想法?谢谢!

Ale*_*min 102

sqlite中没有ALTER COLUMN.

我相信你唯一的选择是:

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

此其他Stackoverflow答案详细解释了该过程


Noa*_*oah 62

虽然确实没有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)

参考资料如下:


pragma writable_schema
启用此pragma时,可以使用普通的UPDATE,INSERT和DELETE语句更改数据库的SQLITE_MASTER表.警告:滥用此pragma很容易导致数据库文件损坏.

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

ALTER TABLE SYNTAX

  • 这个方法对我有用,虽然为了避免列可能处于不同的顺序(即从以前的ADD COLUMN命令),我使用:UPDATE SQLITE_MASTER SET SQL = replace(SQL,'[MyColumn] integer NOT NULL' ,'[MyColumn] integer NULL')WHERE NAME ='MyTable'.另外,请注意不要将其作为事务的一部分运行 - 它可能会阻止某些早期的事务命令运行. (7认同)

Raj*_*esh 30

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

  1. 开始交易;
  2. CREATE TEMPORARY TABLE t1_backup(a,b);
  3. INSERT INTO t1_backup SELECT a,b FROM t1;
  4. DROP TABLE t1;
  5. CREATE TABLE t1(a,b);
  6. INSERT INTO t1 SELECT a,b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. 承诺

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


小智 6

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

  2. INSERT INTO temp_Table SELECT * FROM 表;

  3. 删除表表;

  4. ALTER TABLE temp_Table 重命名为表;

感谢您帮助我找到一个确定的方法!