Изменить тип столбца в sqlite3 - PullRequest
41 голосов
/ 18 января 2010

Я довольно новичок в SQLite 3, и сейчас мне нужно было добавить столбец в существующую таблицу. Я делал это, делая: ALTER TABLE thetable ADD COLUMN category;.

Конечно, я забыл указать тип этого столбца. Первым делом я подумал об удалении этой колонки, а затем о ее повторном добавлении. Однако, похоже, что у SQLite нет простого способа сделать это, и мне пришлось бы сделать резервную копию таблицы и заново создать ее без столбца.

Это кажется грязным, и мне было интересно, есть ли способ изменить / добавить тип столбца. Я мог бы себе это представить, но мой поиск не дал результатов, так как, будучи новичком в SQLite, я думаю, это произошло из-за того, что моя формулировка в запросе была отключена.

Ответы [ 4 ]

45 голосов
/ 18 января 2010

SQLite не поддерживает удаление или изменение столбцов, , по-видимому, . Но помните, что типы данных столбцов не являются жесткими в SQLite.

Смотри также:

10 голосов
/ 08 марта 2017

Если вы предпочитаете графический интерфейс, Браузер БД для SQLite сделает это несколькими щелчками мыши.

  1. «Файл» - «Открыть базу данных»
  2. На вкладке «Структура базы данных» щелкните содержимое таблицы (не имя таблицы), затем меню «Редактировать», «Изменить таблицу», и теперь вы можете изменить тип данных любого столбца с помощью раскрывающегося меню. Я изменил текстовое поле на «числовое», чтобы получать данные в диапазоне номеров.

Браузер БД для SQLite является открытым и бесплатным. Для Linux это доступно из репозитория.

3 голосов
/ 30 мая 2016

Это возможно путем воссоздания таблицы. Это работает для меня, пожалуйста, выполните следующий шаг:

  1. создать временную таблицу, используя as select * из вашей таблицы
  2. удалите свою таблицу, создайте ее, используя тип столбца модификации
  3. теперь вставьте записи из временной таблицы в вашу вновь созданную таблицу
  4. удалить временную таблицу

выполните все вышеуказанные шаги в рабочем потоке, чтобы уменьшить нагрузку на uithread

0 голосов
/ 10 января 2017
#!/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
...