2010-03-19 16 views
10

Czy istnieje (mniej więcej) standardowy sposób sprawdzania nie tylko, czy istnieje tabela o nazwie mytable, ale także czy jej schemat jest podobny do tego, jaki powinien być? Ja eksperymentuje z H2 database i"Utwórz tabelę, jeśli nie istnieje" - jak sprawdzić schemat?

CREATE TABLE IF NOT EXISTS mytable (....) 

wypowiedzi pozornie tylko sprawdzić nazwy table's . Spodziewam się uzyskać wyjątek, jeśli istnieje tabela o podanej nazwie, ale inny schemat.

+0

"stół o podobnej nazwie"? "schemat podobny do tego, jaki powinien być"? Jest to zbyt ogólnikowe, aby zrozumieć ogólne narzędzie do wyszukiwania. – Thilo

+0

+1, ponieważ ja też chcę taki obiekt. Niekoniecznie w bazie danych, ale w narzędziu/bibliotece. – Thilo

+0

@Thilo: To miał być "stolik z podanym imieniem", naprawiony teraz. Przez "schemat podobny do tego, jaki powinien być" mam na myśli to, że jeśli istnieje tabela o nazwie 'mytable', jej schemat musi być równy temu, co podałem kwerendie; w przeciwnym razie chcę dostać jakiś błąd. Jest to doskonale zdefiniowane zapytanie, więc zastanawiam się, czy (i jeśli nie, dlaczego nie) istnieje sposób na wyrażenie tego. Właściwie to byłem zaskoczony, że "JESZCZE NIE ISTNIEJ" wydaje się tylko sprawdzać nazwę. –

Odpowiedz

1

Nie jestem świadomy żadnej bazy danych, która ma tę funkcję natywnie.

Nie użyłem tego (zrolowałem mój własny kod, aby to zrobić), ale może Apache DdlUtils może pomóc.

Jest to trudne zadanie, szczególnie jeśli chce się współpracować z różnymi dostawcami baz danych. Ponadto, prawdopodobnie istnieją różne opinie na temat tego, jak podobny schemat musi być, aby przejść. Nazwy kolumn, kolejność kolumn, typy kolumn, definicja klucza głównego: oczywiście. Ale co z więzami, nazwami ograniczeń, definicjami przestrzeni tabel i tak dalej?

+0

Rozumiem, może nie być tak proste, jak myślałem. Mimo to, biorąc pod uwagę, że jest to sprawdzian, że praktycznie każdy program korzystający z dowolnej bazy danych * powinien * działać, to niesamowite, że nie ma standardowego rozwiązania. –

4

CREATE TABLE IF NOT EXISTS ... nie jest standardowym kodem SQL.

Należy sprawdzić, czy tabela znajduje się już w katalogu. Na przykład w Javie możesz zrobić coś takiego: connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

Więcej informacji można znaleźć javadoc java.sql.Connection.

+0

który nie sprawdza schematu, chociaż (oczywiście, używając MetaData, możesz to sprawdzić samemu, ale to jest nużące.) JDBC MetaData ma okropne API.). – Thilo

1

odpowiedź dwojaki:

(a) Istnienie tabeli jest coś, co powinno być zapewnione przez procedurę instalacji aplikacji, a nie samej aplikacji w czasie wykonywania.

(b) Jeśli naprawdę sądzisz, że masz uzasadnioną przyczynę odstąpienia od (a), możesz spróbować wysłać zapytanie do katalogu, który jest bazą danych składającą się z tabel, których struktura jest w mniejszym lub większym stopniu określona przez INFORMATION_SCHEMA standardu SQL. Jakie tabele istnieją, jakie mają kolumny, jakie typy danych znajdują się w kolumnach, jakie klucze są zadeklarowane itd. Itd., To wszystko tam jest.

+2

Wiele aplikacji nie chce kłopotać użytkownika za pomocą osobnego skryptu instalatora/skryptu aktualizacyjnego i wewnętrznie zarządzać ich schematem bazy danych.Nawet jeśli nie tworzą tabel, sensowne jest sprawdzenie schematu tabeli podczas uruchamiania, aby potwierdzić integralność aplikacji (zamiast niepowodzenia losowych błędów bazy danych w późniejszym czasie). Nie twierdzę, że takie podejście jest zawsze odpowiednie, ale w niektórych przypadkach jest pożądane. – Thilo

+0

Tak, ja też uważam, że podczas gdy a) może być zwyczajną drogą do zrobienia, to podobne do, powiedzmy, "istnienie dysku C: jest czymś, co powinno być zapewnione przez procedurę instalacji aplikacji, a nie przez aplikację w czasie wykonywania. ". Ale poważna aplikacja nie powinna przyjmować żadnych założeń dotyczących środowiska. Zamiast tego powinien to sprawdzić. Środowiska mogą się zmieniać - i wcześniej czy później będą. –

5
SELECT * 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME  = 'TableName' 
    AND TABLE_SCHEMA = 'public' 
+0

Mógłby pan to rozwinąć? Co to robi? –

+1

Robię to, co się mówi ... Sprawdza, czy taka tabela istnieje w bazie danych. 'INFORMATION_SCHEMA' jest (nieco) wystandaryzowane, więc ta instrukcja działa w większości baz danych. –

+0

działa również w MSSQL, ale tam "domyślny" schemat to "dbo" – isapir

Powiązane problemy