56

我对 SQLite 3 还很陌生,刚才我不得不向现有的表中添加一列。我通过这样做来做到这一点:ALTER TABLE thetable ADD COLUMN category;.

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

这看起来很乱,我想知道是否只有一种修改/添加列类型的方法。我想是这样,但是我的搜索没有产生任何结果,对 SQLite 来说是新手,我想这是因为我的措辞在查询中被关闭了。

4

5 回答 5

51

SQLite显然不支持删除或修改列。但请记住,列数据类型在 SQLite中也不是严格的。

也可以看看:

于 2010-01-18T02:20:02.903 回答
25

如果您更喜欢 GUI,DB Browser for SQLite只需单击几下即可完成此操作。

  1. “文件” - “打开数据库”
  2. 在“数据库结构”选项卡中,单击表内容(不是表名),然后单击“编辑”菜单,“修改表”,现在您可以通过下拉菜单更改任何列的数据类型。我将“文本”字段更改为“数字”,以便检索数字范围内的数据。

SQLite 的 DB Browser 是开源和免费的。对于 Linux,它可以从存储库中获得。

于 2017-03-07T21:18:46.173 回答
6

可以通过重新创建表来实现。它对我的工作请按照以下步骤操作:

  1. 使用 as select * from your table 创建临时表
  2. 删除您的表格,使用修改列类型创建您的表格
  3. 现在将临时表中的记录插入到新创建的表中
  4. 删除临时表

在工作线程中执行上述所有步骤以减少 uithread 上的负载

于 2016-05-30T08:28:16.677 回答
3

有一个更简单的方法:

ALTER TABLE your_main_table ADD COLUMN new_column_name new_column_data_type
UPDATE your_main_table SET new_column_name = CAST(old_column_name as new_data_type_you_want)

我在本地机器上试过这个,它可以工作

于 2021-11-18T19:08:15.050 回答
0

可以通过转储、编辑和重新导入表来实现。

该脚本将为您完成(根据您的需要调整脚本开头的值):

#!/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
于 2017-01-10T20:03:44.597 回答