Ответ 1
SQLite не поддерживает удаление или изменение столбцов, очевидно. Но помните, что типы данных столбца не являются жесткими в SQLite.
Смотрите также:
Я новичок в SQLite 3, и теперь мне пришлось добавить столбец в существующую таблицу. Я продолжал это делать: ALTER TABLE thetable ADD COLUMN category;
.
Конечно, я забыл указать этот тип столбца. Первое, о чем я думал, - это удалить этот столбец, а затем снова добавить его. Однако, похоже, что SQLite не имеет простого способа сделать это, и мне пришлось бы делать резервную копию таблицы и воссоздавать ее без столбца.
Это кажется беспорядочным, и мне было интересно, есть ли способ изменить/добавить тип столбца. Я бы так подумал, но мой поиск не дал никаких результатов, будучи новым для SQLite, я предполагаю, что это связано с тем, что моя формулировка отключена в запросе.
SQLite не поддерживает удаление или изменение столбцов, очевидно. Но помните, что типы данных столбца не являются жесткими в SQLite.
Смотрите также:
Если вы предпочитаете графический интерфейс, Браузер БД для SQLite сделает это несколькими щелчками мыши.
DB Browser для SQLite является открытым исходным кодом и бесплатен. Для Linux это доступно из репозитория.
Это возможно путем воссоздания таблицы. Это работает для меня, пожалуйста, выполните следующий шаг:
выполните все вышеуказанные шаги в рабочем потоке, чтобы уменьшить нагрузку на 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