webentwicklung-frage-antwort-db.com.de

Ändern Sie den Typ einer Spalte in sqlite3

Ich bin ziemlich neu in SQLite 3 und musste gerade einer vorhandenen Tabelle eine Spalte hinzufügen. Ich habe das folgendermaßen gemacht: ALTER TABLE thetable ADD COLUMN category;.

Natürlich habe ich vergessen, den Typ dieser Spalte anzugeben. Das erste, worüber ich nachdachte, war, diese Spalte zu löschen und sie dann erneut hinzuzufügen. Es scheint jedoch, dass SQLite keine einfache Möglichkeit hat, dies zu tun, und ich hätte die Tabelle sichern und ohne die Spalte neu erstellen müssen.

Dies scheint chaotisch zu sein, und ich habe mich gefragt, ob es nur eine Möglichkeit gibt, den Typ einer Spalte zu ändern/hinzuzufügen. Das könnte ich mir vorstellen, aber meine Suche ergab keine Ergebnisse, da SQLite neu für mich ist. Ich glaube, das lag an meiner falschen Formulierung in der Abfrage.

41

SQLite unterstützt nicht das Entfernen oder Ändern von Spalten, anscheinend . Denken Sie jedoch daran, dass auch in SQLite die Spaltendatentypen nicht starr sind.

Siehe auch:

45
Roger Pate

Wenn Sie eine GUI bevorzugen, erledigt DB Browser für SQLite dies mit ein paar Klicks.

  1. "Datei" - "Datenbank öffnen"
  2. Klicken Sie auf der Registerkarte "Datenbankstruktur" auf den Tabelleninhalt (nicht auf den Tabellennamen), dann auf das Menü "Bearbeiten" und auf "Tabelle ändern". Jetzt können Sie den Datentyp einer beliebigen Spalte über ein Dropdown-Menü ändern. Ich habe ein Textfeld in ein numerisches Feld geändert, um Daten in einem Zahlenbereich abzurufen.

DB Browser für SQLite ist Open Source und kostenlos. Für Linux ist es im Repository verfügbar.

10
Insilico

Es ist möglich, indem man Tabelle neu erstellt. Seine Arbeit für mich folgt bitte folgendem Schritt:

  1. erstellen Sie eine temporäre Tabelle mit as select * aus Ihrer Tabelle
  2. löschen Sie Ihre Tabelle, erstellen Sie Ihre Tabelle mit Spaltenart ändern
  3. fügen Sie nun Datensätze aus der temporären Tabelle in die neu erstellte Tabelle ein
  4. temporäre Tabelle löschen

führen Sie alle oben genannten Schritte im Worker-Thread aus, um die Belastung von uithread zu verringern

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