In einem MySQL-Skript können Sie schreiben:
CREATE TABLE IF NOT EXISTS foo ...;
... andere Sachen ...
Anschließend können Sie das Skript mehrmals ausführen, ohne die Tabelle neu zu erstellen.
Wie macht man das in PostgreSQL?
quelle
In einem MySQL-Skript können Sie schreiben:
CREATE TABLE IF NOT EXISTS foo ...;
... andere Sachen ...
Anschließend können Sie das Skript mehrmals ausführen, ohne die Tabelle neu zu erstellen.
Wie macht man das in PostgreSQL?
Diese Funktion wurde in Postgres 9.1 implementiert :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
Für ältere Versionen gibt es eine Funktion, um dies zu umgehen:
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;
Anruf:
SELECT create_mytable(); -- call as many times as you want.
Anmerkungen:
Bei den Spalten schemaname
und tablename
in pg_tables
wird zwischen Groß- und Kleinschreibung unterschieden. Wenn Sie Bezeichner in der CREATE TABLE
Anweisung in doppelte Anführungszeichen setzen , müssen Sie genau dieselbe Schreibweise verwenden. Wenn Sie dies nicht tun, müssen Sie Zeichenfolgen in Kleinbuchstaben verwenden. Sehen:
pg_tables
enthält nur aktuelle Tabellen . Die Kennung kann weiterhin von verwandten Objekten belegt sein. Sehen:
Wenn die Rolle der Ausführung dieser Funktion nicht über die erforderlichen Berechtigungen verfügen , um die Tabelle erstellen Sie verwenden möchten SECURITY DEFINER
für die Funktion und machen es im Besitz von einer anderen Rolle mit den notwendigen Berechtigungen. Diese Version ist sicher genug.
CREATE FUNCTION
nur einmal ausführen . Es ist ,SELECT create_mytable();
dass Sie oft anrufen möchten.Versuche dies:
quelle
IF NOT EXISTS
Option enthielt .Ich habe aus den vorhandenen Antworten eine generische Lösung erstellt, die für jede Tabelle wiederverwendet werden kann:
Verwendung:
Es könnte weiter vereinfacht werden, nur einen Parameter zu verwenden, wenn man den Tabellennamen aus dem Abfrageparameter extrahieren würde. Auch ich habe die Schemata weggelassen.
quelle
Diese Lösung ähnelt der Antwort von Erwin Brandstetter, verwendet jedoch nur die SQL-Sprache.
Nicht alle PostgreSQL-Installationen haben standardmäßig die Sprache plpqsql. Dies bedeutet, dass Sie möglicherweise
CREATE LANGUAGE plpgsql
vor dem Erstellen der Funktion aufrufen und anschließend die Sprache erneut entfernen müssen, um die Datenbank im gleichen Zustand wie zuvor zu belassen (jedoch nur, wenn die Datenbank vorhanden ist) hatte zunächst nicht die Sprache plpgsql). Sehen Sie, wie die Komplexität wächst?Das Hinzufügen von plpgsql ist möglicherweise kein Problem, wenn Sie Ihr Skript lokal ausführen. Wenn das Skript jedoch zum Einrichten eines Schemas bei einem Kunden verwendet wird, ist es möglicherweise nicht wünschenswert, solche Änderungen in der Kundendatenbank zu belassen.
Diese Lösung ist inspiriert von einem Beitrag von Andreas Scherbaum .
quelle
Es gibt keine CREATE TABLE, WENN NICHT EXISTIERT ... aber Sie können eine einfache Prozedur dafür schreiben, so etwas wie:
quelle
Es gibt keine CREATE TABLE, WENN NICHT EXISTIERT ... aber Sie können eine einfache Prozedur dafür schreiben, so etwas wie:
quelle