2011-01-08 11 views
5

Jak dodać kolumnę do tabeli SQLite wtedy i tylko wtedy, gdy ta sama kolumna nie istnieje w tabeli?W sqlite Jak dodać kolumnę w tabeli, jeśli ta sama kolumna nie istnieje w tabeli

Korzystanie z ALTER TABLE Jestem w stanie utworzyć nową kolumnę, ale chcę wiedzieć, jak sprawdzić, czy kolumna już istnieje w tabeli, czy nie?

+1

można przeglądać za pomocą kolumn tabeli „TableName .schema” – krakover

+1

@krakover Czy to nie jest odpowiedź? –

+0

@goreSplatter W zależności od tego, co próbuje osiągnąć. Wyjaśniłem, jak uniknąć problemu, a nie jak go rozwiązać .. \ – krakover

Odpowiedz

0

można przeglądać za pomocą kolumn tabeli „TableName .schema”

+2

Czy możesz podać przykład sql? – boiledwater

6

SQLite zwraca błąd «nie taki jak kolumny: foo», jeśli tabela nie zawiera kolumny:

select foo from yourTable limit 1 

Ponadto można uzyskać instrukcję create-table:

select sql from sqlite_master where tbl_name = 'YourTableName' 

, a następnie przeanalizować wynik, szukając nazwy kolumny. Nie znam eleganckiego sposobu sprawdzania listy kolumn dla określonej tabeli, chociaż może istnieć.

Także jeśli spróbujesz to zrobić:

alter table YourTable add column foo {column-def whatever it is} 

pojawi się błąd z SQLite jeśli kolumna już istnieje. Możesz również złapać ten błąd.

Wreszcie można to zrobić:

select sql from sqlite_master 
    where tbl_name = 'YOURTABLE' and sql like '%"foo" CHAR%'; -- or whatever type 

i jeśli podana tabela zawiera kolumny, który jest otoczony cudzysłowami w zapytaniu, a z typem podałeś, można uzyskać wynik, w innym przypadku pusty zestaw. Określenie typu danych zapewnia, że ​​podłańcuch LIKE jest zgodny z nazwą kolumny.

4

Nie ma sposobu (o którym wiem), aby zrobić to wszystko w jednym zapytaniu SQLite. Musisz użyć kodu aplikacji, aby zarządzać If/Elseness.

Sprawdź, czy tabela istnieje lub nie:

select count(*) from sqlite_master where type = 'table' and name = MyTable'; 

Sprawdź, czy kolumna istnieje w tabeli lub teraz

pragma table_info(thumbnail); 

Jednak lepszym rozwiązaniem może być wyraźne aktualizacje schematu bazy danych w oparciu o wersje schematu swoją aplikację utrzymuje (np. konkretne polecenie zmiany tabeli, aby przejść od wersji schematu 1 do 2):

pragma user_version; 
0

Wygląda na to, że niemożliwe jest sprawdzenie, czy kolumna nie istnieje i dodanie nowej kolumny w jednym poleceniu, ponieważ Sqlite nie obsługuje "IF NOT EXISTS" dla kolumny. "IF NOT EXISTS" działa tylko na stole. Oto co zrobię:

rev = ExecuteStatement("SELECT columnNamexx FROM tableNamexx limit 1;"); 

if(rev != SQLITE_OK){ // add col to table 
    ExecuteStatement("ALTER TABLE tableNamexx ADD COLUMN columnNamexx INTEGER DEFAULT 0;"); 
} 
Powiązane problemy