Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sqlite3中修改列的类型_Sqlite_Alter Table - Fatal编程技术网

在sqlite3中修改列的类型

在sqlite3中修改列的类型,sqlite,alter-table,Sqlite,Alter Table,我对SQLITE3非常陌生,刚才我不得不向现有的表中添加一列。我这样做的方式是:改变表thetable ADD COLUMN category 当然,我忘了指定该列的类型。我想做的第一件事是删除该专栏,然后重新添加它。然而,SQLite似乎没有一种简单的方法来实现这一点,我不得不备份表并在没有列的情况下重新创建它 这看起来很混乱,我想知道是否有一种方法可以修改/添加列的类型。我想是这样的,但是我的搜索没有结果,因为对SQLite来说是新的,我想这是因为我在查询中的措辞不正确。SQLite不支持删

我对SQLITE3非常陌生,刚才我不得不向现有的表中添加一列。我这样做的方式是:改变表thetable ADD COLUMN category

当然,我忘了指定该列的类型。我想做的第一件事是删除该专栏,然后重新添加它。然而,SQLite似乎没有一种简单的方法来实现这一点,我不得不备份表并在没有列的情况下重新创建它


这看起来很混乱,我想知道是否有一种方法可以修改/添加列的类型。我想是这样的,但是我的搜索没有结果,因为对SQLite来说是新的,我想这是因为我在查询中的措辞不正确。

SQLite不支持删除或修改列。但也要记住SQLite中的列数据类型

另见:


可以通过重新创建表来实现。我的工作如下所示:

使用as select*从表中创建临时表 删除表格,使用“修改列类型”创建表格 现在将记录从临时表插入到新创建的表中 放下临时桌子
在工作线程中执行上述所有步骤以减少uithread上的负载,可以通过转储、编辑和重新导入表来实现

此脚本将帮助您根据需要调整脚本开头的值:

#!/bin/bash

DB=/tmp/synapse/homeserver.db
TABLE="public_room_list_stream"
FIELD=visibility
OLD="BOOLEAN NOT NULL"
NEW="INTEGER NOT NULL"
TMP=/tmp/sqlite_$TABLE.sql

echo "### create dump"
echo ".dump '$TABLE'" | sqlite3 "$DB" >$TMP

echo "### editing the create statement"
sed -i "s|$FIELD $OLD|$FIELD $NEW|g" $TMP

read -rsp $'Press any key to continue deleting and recreating the table $TABLE ...\n' -n1 key 

echo "### rename the original to '$TABLE"_backup"'"
sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'"

echo "### delete the old indexes"
for idx in $(echo "SELECT name FROM sqlite_master WHERE type == 'index' AND tbl_name LIKE '$TABLE""%';" | sqlite3 $DB); do
  echo "DROP INDEX '$idx';" | sqlite3 $DB
done

echo "### reinserting the edited table"
cat $TMP | sqlite3 $DB
如果您喜欢GUI,只需单击几下即可完成此操作

文件开放数据库 在“数据库结构”选项卡中,单击“表内容”而不是“表名称”,然后单击“编辑”菜单“修改表”,现在可以使用下拉菜单更改任何列的数据类型。为了检索数字范围内的数据,我将“文本”字段更改为“数字”。
SQLite的DB浏览器是开源和免费的。对于Linux,它可以从存储库中获得。

因此,如果我没有定义类型,我仍然可以在其中插入文本?当然,稍后当我部署到生产环境时,我会显式地声明类型文本,但现在我应该可以了?是的。您也可以在该列中插入非文本值:SQLite使用更通用的动态类型系统。在SQLite中,值的数据类型与值本身关联,而不是与其容器关联。在我的第二个链接中,指定列的类型在SQLite中的意义要比其他RDBMs小得多。。。但是,如果以后创建了其他具有本应使用的数据类型的表,那么您的联接查询将无法使用索引,因为列的类型不同,列上没有类型也会导致where子句出现问题。例如,如果声明一个没有类型的_id列,则使用占位符的where子句,例如where _id=?将永远不会返回任何行,因为最终查询将使用where _id='1',SQLite不知道如何正确进行比较。它将把两者作为where子句中的字符串和行数据中的整数进行比较,每次都是false。省略列类型似乎是一个很大的疏忽,但SQLite允许它似乎是一个更大的疏忽。因此,如果将列类型定义为INT,则可以在其中插入VARCHAR值?单击表内容而不是表名称是什么意思?在Database Structure选项卡下,我必须单击Tables->Mytable下的表名。我还可以右键单击表名,弹出一个菜单,您可以在其中选择“修改表”。在现有sqlite数据库上尝试任何DB Browser表修改之前,请备份数据库:在较新版本中,该菜单中似乎不存在此选项。。。也许是为了澄清最初的答案和几个问题。截至2021年5月,修改表格选项仍然存在。如果单击相关表的Schema列,然后转到edit菜单,您将找到modifytable选项。但是,请注意,如果您在有问题的表上定义了视图,那么这将无法正常工作,因为该工具通过复制和重新创建表来实现这一点。这可能有助于其他想知道如何首先避免这种情况的人。。。在列名后指定列特征。一个例子:ALTER TABLE THETTABLE ADD COLUMN thenewcolumn INTEGER DEFAULT 0.SQLite现在的ALTER功能有限:我想知道,您是否可以将代码添加到您的答案中?这是一个例子:创建表格temp AS select a、b、c、CASTd AS INTEGER AS d d(从原始文件中新建);稍后删除您不需要的内容