在sqlite中更改列

s8vozzvw  于 2023-10-23  发布在  SQLite
关注(0)|答案(7)|浏览(210)

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

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

我相信在sqlite中根本没有ALTER COLUMN,只支持ALTER TABLE。
有什么想法吗?谢谢!

g9icjywg

g9icjywg1#

在sqlite中没有ALTER COLUMN。
我相信你唯一的选择就是:

  • 将表重命名为临时名称
  • 创建不带NOT NULL约束的新表
  • 将旧表的内容复制到新表中
  • 把旧table搬走

另一个Stackoverflow答案详细解释了这个过程

j8yoct9x

j8yoct9x2#

虽然没有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**

参考资料如下:

杂注可写模式
当此杂注为on时,可以使用普通的UPDATE、INSERT和DELETE语句更改SQLITE_MASTER表中的数据库。警告:误用此杂注很容易导致数据库文件损坏。
[alter table](来自http://www.sqlite.org/lang_altertable.html
SQLite支持ALTER TABLE的有限子集。SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。不能重命名列、删除列,也不能在表中添加或删除约束。

wkyowqbh

wkyowqbh3#

SQLite支持ALTER TABLE的有限子集。SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列。不能重命名列、删除列,也不能在表中添加或删除约束。但是你可以通过下面的步骤改变表列的数据类型或其他属性。
1.开始交易;
1.创建临时表t1_backup(a,b);
1.返回到t1_backup SELECT a,b FROM t1;
1.删除表t1;

  1. CREATE TABLE t1(a,b);
    1.从t1_备份中选择a,B;
  2. DROP TABLE t1_backup;
    1.承诺
    有关更多详细信息,请参阅link
xmjla07d

xmjla07d4#

  1. int x,y[,etc];
  2. SELECT * FROM表;
  3. DROP TABLE表;
    1.修改表的名字;
    谢谢你帮我找到一个好方法!
8qgya5xd

8qgya5xd5#

ALTER COLUMNSQLite中不存在。
仅支持alter操作:

  • 更改表名
  • 更改表列名称
  • 添加新列
  • Drop Column

Alex Jasmin's answer shows possible way
参考文件:

brgchamk

brgchamk6#

我建议你使用DB Browser for SQLite。您可以轻松地更改约束。例如,在DB Browser for SQLite中,您可以转到Database Structure -> Right Click your table -> Click Modify Table ->并取消选中NN(Not Rank)列,然后单击OK。

7xzttuei

7xzttuei7#

如果您所做的只是更改列的类型,那么您通常不需要更改列,因为SQLite是动态类型的,您可以放入列类型以外的数据;列类型更多的是一种建议,而不是其他任何东西。列的类型(强制规则)有一些怪癖,您可能需要解决这些问题,但是数据库将很乐意接受“错误”类型的数据。
实际上,您通常不会彻底更改列的类型(在典型的数据库中,您通常只更改类型的大小-例如VARCHAR(16)-> VARCHAR(32)-而不是类型的类别),因此,唯一需要努力解决的问题是NOT NULL约束-在这种情况下,你可以使用这里的其他有用的答案之一,以实现你正在寻找的。

相关问题