W skrypcie MySQL możesz napisać:
CREATE TABLE IF NOT EXISTS foo ...;
... inne rzeczy ...
a następnie możesz uruchamiać skrypt wiele razy bez ponownego tworzenia tabeli.
Jak to robisz w PostgreSQL?
źródło
W skrypcie MySQL możesz napisać:
CREATE TABLE IF NOT EXISTS foo ...;
... inne rzeczy ...
a następnie możesz uruchamiać skrypt wiele razy bez ponownego tworzenia tabeli.
Jak to robisz w PostgreSQL?
Ta funkcja została zaimplementowana w Postgres 9.1 :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
W przypadku starszych wersji jest funkcja umożliwiająca obejście tego problemu:
CREATE OR REPLACE FUNCTION create_mytable ()
RETURNS void AS
$func$
BEGIN
IF EXISTS (SELECT FROM pg_catalog.pg_tables
WHERE schemaname = 'myschema'
AND tablename = 'mytable') THEN
RAISE NOTICE 'Table myschema.mytable already exists.';
ELSE
CREATE TABLE myschema.mytable (i integer);
END IF;
END
$func$ LANGUAGE plpgsql;
Połączenie:
SELECT create_mytable(); -- call as many times as you want.
Uwagi:
W kolumnach schemaname
i tablename
in pg_tables
rozróżniana jest wielkość liter. W przypadku podwójnego cudzysłowu identyfikatory w CREATE TABLE
instrukcji należy użyć dokładnie tej samej pisowni. Jeśli tego nie zrobisz, musisz użyć małych liter. Widzieć:
pg_tables
zawiera tylko rzeczywiste tabele . Identyfikator może nadal być zajęty przez powiązane obiekty. Widzieć:
Jeśli rola wykonująca tę funkcję nie ma uprawnień niezbędnych do utworzenia tabeli, możesz zechcieć użyć SECURITY DEFINER
tej funkcji i uczynić ją własnością innej roli z niezbędnymi uprawnieniami. Ta wersja jest wystarczająco bezpieczna.
CREATE FUNCTION
tylko raz. Chodzi o to,SELECT create_mytable();
że możesz chcieć dzwonić wiele razy.Spróbuj tego:
źródło
IF NOT EXISTS
opcję.Stworzyłem ogólne rozwiązanie z istniejących odpowiedzi, które można ponownie wykorzystać dla dowolnej tabeli:
Stosowanie:
Można by jeszcze bardziej uprościć, aby pobrać tylko jeden parametr, jeśli wyodrębni się nazwę tabeli z parametru zapytania. Pominąłem też schematy.
źródło
To rozwiązanie jest nieco podobne do odpowiedzi Erwina Brandstettera, ale używa tylko języka sql.
Nie wszystkie instalacje PostgreSQL mają domyślnie język plpqsql, co oznacza, że może być konieczne wywołanie
CREATE LANGUAGE plpgsql
przed utworzeniem funkcji, a następnie ponowne usunięcie języka, aby pozostawić bazę danych w tym samym stanie, w jakim była wcześniej (ale tylko jeśli baza danych nie ma języka plpgsql na początku). Widzisz, jak rośnie złożoność?Dodanie pliku plpgsql może nie stanowić problemu, jeśli uruchamiasz swój skrypt lokalnie, jednak jeśli skrypt jest używany do konfigurowania schematu u klienta, pozostawienie takich zmian w bazie danych klientów może być niepożądane.
To rozwiązanie zostało zainspirowane postem Andreasa Scherbauma .
źródło
Nie ma opcji CREATE TABLE, JEŚLI NIE ISTNIEJE ... ale możesz napisać prostą procedurę, na przykład:
źródło
Nie ma opcji CREATE TABLE, JEŚLI NIE ISTNIEJE ... ale możesz napisać prostą procedurę, na przykład:
źródło