web-dev-qa-db-ja.com

sqlite3で列のタイプを変更する

私はSQLite 3にかなり慣れていないので、今持っていた既存のテーブルに列を追加する必要がありました。私はそれを行うことで行った:ALTER TABLE thetable ADD COLUMN category;

もちろん、その列のタイプを指定するのを忘れていました。最初に考えていたのは、その列を削除してから再度追加することでした。ただし、SQLiteにはこれを行う簡単な方法がないため、テーブルをバックアップし、列なしで再作成する必要がありました。

これは厄介に思えますが、列の型を変更/追加する方法だけがあるのではないかと思っていました。私はそう想像しますが、SQLiteを初めて使用して検索しても結果が得られなかったのは、クエリで文言がオフになったためだと思います。

41

SQLiteは、列の削除または変更をサポートしていません 明らかに 。ただし、SQLiteでも列データ型 厳密ではない であることを忘れないでください。

こちらもご覧ください:

45
Roger Pate

GUIを好む場合、 SQLiteのDBブラウザー は数回クリックするだけでこれを行います。

  1. 「ファイル」-「データベースを開く」
  2. [データベース構造]タブで、テーブルの内容(テーブル名ではない)、[編集]メニュー、[テーブルの変更]の順にクリックし、ドロップダウンメニューで列のデータ型を変更できるようになりました。数値範囲のデータを取得するために、「テキスト」フィールドを「数値」に変更しました。

SQLite用DB Browserはオープンソースであり、無料です。 Linuxの場合、リポジトリから入手できます。

10
Insilico

テーブルを再作成することで可能になります。それは私のために次の手順に従ってください:

  1. テーブルからselect *を使用して一時テーブルを作成します
  2. テーブルをドロップし、列タイプの変更を使用してテーブルを作成します
  3. 一時テーブルから新しく作成したテーブルにレコードを挿入します
  4. 一時テーブルを削除する

ワーカースレッドで上記のすべての手順を実行して、uithreadの負荷を減らします。

3
RD-07
#!/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
0
rubo77