在sqlite3中修改列的类型

时间:2010-01-18 02:11:03

标签: sqlite alter-table

我是SQLite 3的新手,刚才我必须在现有的表中添加一列。我通过这样做来实现这一目的:ALTER TABLE thetable ADD COLUMN category;

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

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

4 个答案:

答案 0 :(得分:45)

SQLite不支持删除或修改列apparently。但请记住SQLite中的列数据类型aren't rigid

另见:

答案 1 :(得分:9)

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

  1. “文件” - “打开数据库”
  2. 在“数据库结构”选项卡中,单击表格内容(不是表格名称),然后单击“编辑”菜单,“修改表格”,现在您可以使用下拉菜单更改任何列的数据类型。我将“文本”字段更改为“数字”,以便检索数字范围内的数据。
  3. SQLite的DB Browser是开源的,免费的。对于Linux,它可以从存储库中获得。

答案 2 :(得分:3)

可以通过重新创建表格。它适用于我,请按照以下步骤操作:

  1. 使用表格中的select *创建临时表
  2. 删除您的表,使用修改列类型
  3. 创建表
  4. 现在将临时表中的记录插入到新创建的表中
  5. drop temporary table
  6. 在工作线程中执行上述所有步骤以减少uithread上的负载

答案 3 :(得分: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