Musiałbym zmienić nazwę kilku kolumn w niektórych tabelach w bazie danych SQLite. Wiem, że podobne pytanie zadawano wcześniej przy przepełnieniu stosu, ale ogólnie dotyczyło ono SQL, a sprawa SQLite nie została wspomniana.
Z dokumentacji SQLite dla ALTER TABLE wynika, że nie jest możliwe zrobienie czegoś takiego „łatwo” (tj. Pojedyncza instrukcja ALTER TABLE).
Zastanawiałem się, czy ktoś wiedział o ogólnym sposobie zrobienia czegoś takiego z SQLite.
sqlite
alter-table
joce
źródło
źródło
Odpowiedzi:
Zostało to naprawione za pomocą 15.09.2018 (3.25.0)
Możesz znaleźć nową składnię udokumentowaną pod
ALTER TABLE
Źródło obrazu: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Przykład:
demo db-fiddle.com
Wsparcie dla systemu Android
W chwili pisania API Androida 27 używa pakietu SQLite w wersji 3.19 .
W oparciu o bieżącą wersję używaną przez Androida i tę aktualizację nadchodzi w wersji 3.25.0 SQLite, powiedziałbym, że masz trochę czasu (około API 33), zanim wsparcie dla tego zostanie dodane do Androida.
I nawet wtedy, jeśli potrzebujesz obsługiwać wersje starsze niż API 33, nie będziesz mógł tego użyć.
źródło
database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")
. COLUM jest podświetlone na czerwono i jest napisane TO oczekiwano, otrzymał „COLUMN” . Niestety Android wciąż działa na SQLite w wersji 3.19 i dlatego to nie działa dla mnie.Załóżmy, że masz tabelę i musisz zmienić nazwę „colb” na „col_b”:
Najpierw zmień nazwę starej tabeli:
Następnie utwórz nową tabelę na podstawie starej tabeli, ale ze zaktualizowaną nazwą kolumny:
Następnie skopiuj zawartość z oryginalnej tabeli.
Na koniec upuść stary stół.
Owinięcie tego wszystkiego w
BEGIN TRANSACTION;
iCOMMIT;
jest prawdopodobnie dobrym pomysłem.źródło
.schema
Polecenie SQLite jest przydatne do wyświetlaniaCREATE TABLE
instrukcji tworzących istniejącą tabelę. Możesz pobrać dane wyjściowe, zmodyfikować w razie potrzeby i wykonać je, aby utworzyć nową tabelę. To polecenie pokazuje także niezbędneCREATE INDEX
polecenia do utworzenia indeksów, które powinny obejmować obawy Thomasa. Oczywiście, pamiętaj, aby uruchomić to polecenie, zanim cokolwiek zmienisz.Przekopując się, znalazłem to wieloplatformowe (Linux | Mac | Windows) narzędzie graficzne o nazwie DB Browser dla SQLite, które pozwala na zmianę nazwy kolumn w bardzo przyjazny dla użytkownika sposób!
Edytuj | Zmień tabelę | Wybierz tabelę | Edytuj pole. Kliknij kliknij! Voila!
Jednakże, jeśli ktoś chce podzielić się programowym sposobem zrobienia tego, chętnie się dowiem!
źródło
Chociaż prawdą jest, że nie ma ZMIEŃ KOLUMNĘ, jeśli chcesz tylko zmienić nazwę kolumny, usunąć ograniczenie NOT NULL lub zmienić typ danych, możesz użyć następującego zestawu poleceń:
Uwaga: te polecenia mogą uszkodzić bazę danych, więc upewnij się, że masz kopię zapasową
Będziesz musiał zamknąć i ponownie otworzyć połączenie lub odkurzyć bazę danych, aby ponownie załadować zmiany do schematu.
Na przykład:
REFERENCJE OBSERWUJĄ:
pragma writable_schema
Gdy ta pragma jest włączona, tabele SQLITE_MASTER, w których bazę danych można zmieniać za pomocą zwykłych instrukcji UPDATE, INSERT i DELETE. Ostrzeżenie: niewłaściwe użycie tej pragmy może łatwo doprowadzić do uszkodzenia pliku bazy danych.
tabela zmian
SQLite obsługuje ograniczony podzbiór ALTER TABLE. Polecenie ALTER TABLE w SQLite pozwala użytkownikowi zmienić nazwę tabeli lub dodać nową kolumnę do istniejącej tabeli. Nie można zmienić nazwy kolumny, usunąć kolumny ani dodać lub usunąć ograniczeń z tabeli.
źródło
Ostatnio musiałem to zrobić w SQLite3 z tabelą o nazwie points z colunms id, lon, lat . Błędnie, gdy tabela została zaimportowana, wartości szerokości geograficznej były przechowywane w kolumnie lon i viceversa, więc oczywistą poprawką byłaby zmiana nazw tych kolumn. Więc sztuczka polegała na:
Mam nadzieję, że to ci się przyda!
źródło
Cytując dokumentację sqlite :
Możesz oczywiście utworzyć nową tabelę z nowym układem
SELECT * FROM old_table
i wypełnić nową tabelę wartościami, które otrzymasz.źródło
Po pierwsze, jest to jedna z tych rzeczy, które uderzają mnie z zaskoczenia: zmiana nazwy kolumny wymaga utworzenia zupełnie nowej tabeli i skopiowania danych ze starej tabeli do nowej tabeli ...
GUI, na którym wylądowałem, aby wykonywać operacje SQLite, to Base . Ma ładne okno dziennika, które pokazuje wszystkie polecenia, które zostały wykonane. Wykonanie zmiany nazwy kolumny za pomocą bazy powoduje wypełnienie okna dziennika niezbędnymi komendami:
Można je następnie łatwo skopiować i wkleić w razie potrzeby. Dla mnie to dotyczy ActiveAndroid plik migracji . Miłym akcentem jest również to, że skopiowane dane zawierają tylko polecenia SQLite, a nie znaczniki czasu itp.
Mam nadzieję, że zaoszczędzi to niektórym ludziom czas.
źródło
BEGIN TRANSACTION;
iCOMMIT;
linii, jak uchwyty ActiveAndroid że sama.PRZYPADEK 1: SQLite 3.25.0+
Tylko wersja 3.25.0 SQLite obsługuje zmianę nazw kolumn. Jeśli twoje urządzenie spełnia ten wymóg, wszystko jest dość proste. Poniższe zapytanie rozwiązałoby problem:
PRZYPADEK: Starsze wersje SQLite
Musisz zastosować inne podejście, aby uzyskać wynik, który może być nieco trudny
Na przykład, jeśli masz taką tabelę:
A jeśli chcesz zmienić nazwę kolumny
Location
Krok 1: Zmień nazwę oryginalnej tabeli:
Krok 2: Teraz utwórz nową tabelę
student
z poprawną nazwą kolumny:Krok 3: Skopiuj dane z oryginalnej tabeli do nowej tabeli:
Uwaga: powyższe polecenie powinno składać się z jednej linii.
Krok 4: Upuść oryginalny stół:
Za pomocą tych czterech kroków możesz ręcznie zmienić dowolną tabelę SQLite. Pamiętaj, że będziesz musiał także odtworzyć wszelkie indeksy, przeglądarki lub wyzwalacze w nowej tabeli.
źródło
zmień kolumnę tabeli <id> na <_id>
źródło
Utwórz nową kolumnę z żądaną nazwą kolumny: COLNew.
Skopiuj zawartość starej kolumny COLOld do nowej kolumny COLNew.
Uwaga: nawiasy klamrowe są konieczne w linii powyżej.
źródło
Jak wspomniano wcześniej, istnieje narzędzie SQLite Database Browser, które to robi. Lyckily to narzędzie prowadzi dziennik wszystkich operacji wykonywanych przez użytkownika lub aplikację. Robiąc to raz i patrząc na dziennik aplikacji, zobaczysz związany z tym kod. Skopiuj zapytanie i wklej zgodnie z wymaganiami. Pracował dla mnie. Mam nadzieję że to pomoże
źródło
Z oficjalnej dokumentacji
W przypadku niektórych zmian, które w żaden sposób nie wpływają na zawartość dysku, można opcjonalnie zastosować prostszą i szybszą procedurę . Poniższa prostsza procedura jest odpowiednia do usuwania ograniczeń CHECK lub FOREIGN KEY lub NOT NULL, zmiany nazw kolumn lub dodawania lub usuwania lub zmiany wartości domyślnych w kolumnie.
Rozpocznij transakcję.
Uruchom PRAGMA wersja_schematu, aby ustalić numer bieżącej wersji schematu. Numer ten będzie potrzebny w kroku 6 poniżej.
Aktywuj edycję schematu za pomocą PRAGMA writable_schema = ON.
Uruchom instrukcję UPDATE, aby zmienić definicję tabeli X w tabeli sqlite_master: UPDATE sqlite_master SET sql = ... GDZIE type = 'table' AND name = 'X';
Uwaga: Dokonanie zmiany w tabeli sqlite_master w ten sposób spowoduje, że baza danych będzie uszkodzona i nieczytelna, jeśli zmiana zawiera błąd składniowy. Zaleca się dokładne przetestowanie instrukcji UPDATE w osobnej pustej bazie danych przed użyciem jej w bazie danych zawierającej ważne dane.
Jeśli zmiana w tabeli X wpływa również na inne tabele lub indeksy lub wyzwalacze są widokami w schemacie, uruchom instrukcje UPDATE, aby zmodyfikować również inne indeksy tabel i widoki. Na przykład, jeśli zmienia się nazwa kolumny, wszystkie ograniczenia, wyzwalacze, indeksy i widoki KLUCZA OBCYCH, które odnoszą się do tej kolumny, muszą zostać zmodyfikowane.
Uwaga: Ponowne wprowadzenie takich zmian w tabeli sqlite_master spowoduje, że baza danych będzie uszkodzona i nieczytelna, jeśli zmiana zawiera błąd. Dokładnie przetestuj całą procedurę w osobnej testowej bazie danych przed użyciem jej w bazie danych zawierającej ważne dane i / lub wykonaj kopie zapasowe ważnych baz danych przed uruchomieniem tej procedury.
Zwiększ numer wersji schematu za pomocą PRAGMA schema_version = X, gdzie X jest o jeden więcej niż stary numer wersji schematu znaleziony w kroku 2 powyżej.
Wyłącz edycję schematu za pomocą PRAGMA writable_schema = OFF.
(Opcjonalnie) Uruchom PRAGMA integrity_check, aby sprawdzić, czy zmiany schematu nie spowodowały uszkodzenia bazy danych.
Zatwierdź transakcję rozpoczętą w kroku 1 powyżej.
źródło
Jedną z opcji, jeśli trzeba to zrobić w mgnieniu oka, a jeśli początkowa kolumna została utworzona domyślnie, to utworzyć nową kolumnę, którą chcesz, skopiować zawartość do niej i po prostu „porzucić” starą kolumnę (pozostaje obecny, ale po prostu go nie używasz / nie aktualizujesz itp.)
dawny:
Pozostawia to za sobą kolumnę (a jeśli została utworzona z opcją NOT NULL, ale bez wartości domyślnej, przyszłe wstawki, które ją zignorują, mogą się nie powieść), ale jeśli jest to zwykła tabela, kompromisy mogą być do zaakceptowania. W przeciwnym razie skorzystaj z jednej z innych wymienionych tutaj odpowiedzi lub innej bazy danych, która pozwala na zmianę nazw kolumn.
źródło
Od wersji 2018-09-15 (3.25.0) sqlite obsługuje zmianę nazw kolumn
https://sqlite.org/changes.html
źródło
sqlite3 twodb .dump> /tmp/db.txt
edytuj /tmp/db.txt zmień nazwę kolumny w Utwórz wiersz
sqlite2 yourdb2 </tmp/db.txt
mv / move yourdb2 yourdb
źródło