Prüfung vor CREATE TABLE

Hallo,

ich bin neu hier und habe folgende Frage:

bei MySQL kann ich prüfen, ob eine Tabelle existiert, bevor ich ein CREATE TABLE mache. Leider gibt es das so nicht in PSQL. (CREATE TABLE table IF NOT EXIST …)

Wie kann man bei PSQL verhindern, dass ein Fehler auftritt ?

Gruß
Peter



test=# drop table if exists foo;
DROP TABLE
test=*# drop table if exists foo;
NOTICE:  table "foo" does not exist, skipping
DROP TABLE

Andreas

damit du dich das beim naechsten dbms (oracle sqlserver etc.) nicht wieder frage musst: information_schema - gibt es inzwischen auch bei MySQL

select * from information_schema.tables 
where table_schema = ...
  and table_name = ...

fehlerbehandlung musst du aber sowieso bauen - warum also nicht einfach das create absetzen und auf den fehler reagieren

Du erklärst jetzt bitte noch das SQL,wie er in Abhängigkeit davon die Tabelle erstellt oder nicht, ohne eine Fehlermeldung zu erhalten. Egal, ob Tabelle schon existiert oder nicht.

Andreas

gern - indem er das statement absetzt und in abhaengigkeit von der ergebnismenge (die leer sein sollte - wenn die table oder das view nicht existiert) - das create ausfuehrt - oder eben nicht.

leider ist das beschriebene problem nicht mit nur einem statement zu loesen - auch mit drop nicht, das fataler weise die table dropen wuerde wenn sie existiert - das wollte er auch nicht.

daher mein hinweis, den fehler einfach geschehen zu lassen und geeignet drauf reagieren …

So etwas ähnliches betreibe ich hier schon:

create language if not exist - ads’ corner

Die Funktion kann man noch temporär gestalten.
Auf alle Fälle funktioniert das Statement, ohne Fehler zu verursachen und lässt sich einfach auf Tabellen statt auf Sprachen umschreiben.

schön

weisst du zufaellig warum es ein adäquates IF NOT EXIST bei CREATE TABLE nicht gibt? etwas wunderlich ist das schon - weil an zig anderen stellen hat man derartiges vorgesehen - ironischer weise sogar bei DROP TABLE - bei funktionen z.B. - einfach weil es praktisch ist …

am fortschrittlichesten in der welt waere, wenn Postgres eine bedingung bei jedem DDL statement erlauben wuerde - und zwar ein beliebiges

CREATE …
IF …

DROP …
IF …

ALTER …
IF …

wobei boolean expression dann auch wieder ein select statement enthalten koennte

das wäre mal was

Dir ist der Unterschied zwischen CREATE und DROP schon klar, oder?

Wenn ich eine Tabelle löschen möchte, die es nicht gibt, ist das nicht unbedingt ein Problem.
Wenn ich eine Tabelle erstellen möchte, die es schon gibt - wer garantiert mir, dass das die Tabelle mit der gleichen Struktur ist, die ich haben möchte? Das ist ein Problem. Das Problem möchte ich auch nicht mit einem “Ach, passt scho” umgehen. Wenn mir das so egal ist, kann ich ja ein DROP … IF davor setzen und das Problem ist aus der Welt.

Darum gibt es für DROP ein IF und für CREATE nicht.

Muss das sein? Niemand zwingt Dich zu antworten.

Wenn ich eine Tabelle löschen möchte, die es nicht gibt, ist das nicht unbedingt ein Problem.
Wenn ich eine Tabelle erstellen möchte, die es schon gibt - wer garantiert mir, dass das die Tabelle mit der gleichen Struktur ist, die ich haben möchte?

dann sollte CREATE TABLE … IF eben nicht nur den Namen, sondern die gesamte Signatur der Table beruecksichten … also auch kein Problem …

dann gibt es keinen Fehler wenn es der gleiche Table-Typ ist - aber trotzdem einen Fehler wenn die Table existiert, aber nicht vom selben Typ.

Das gleiche Prinzip wuerde man dann auf Trigger und Constraints anwenden - was insgesammt dazu fuehrt, dass das Modell letztendlich “vorhanden” ist wie ich es brauche.

Das ist ein Problem.

leuchtet ein - aber ist lösbar

Dann frag mich halt nicht wunder Zuerst fragen, warum das so ist, und sich dann beschweren, wenn man es dir erklärt.


dann sollte CREATE TABLE … IF eben nicht nur den Namen, sondern die gesamte Signatur der Table beruecksichten … also auch kein Problem …

Richtig. Also schreib bitte einen Patch dafür und reich ihn ein.


leuchtet ein - aber ist lösbar

Ist schließlich Open-Source Software. Wenn du das so brauchst, kannst du das programmieren.

Wäre ich ein C(++) Virtuose, dann würde ich das tun

Ich kann den Code lesen und verstehen (sofern es nicht zu fachlich wird) - für das Projekt fehlt mir allerdings Routine …

Man muss das nicht selber schreiben, man kann so etwas auch entwickeln lassen.

Deshalb kommuniziere ich z.B. mit Dir … offensichtlich verfügst du über hinreichende Kenntnisse.

Ich gehe mit meiner oben beschriebenen Erklärung konform und habe kein Interesse daran, so etwas zu entwickeln.

Es gibt jedoch genügend andere, die C programmieren können und die du beauftragen kannst.

Hallo Leute,
das ist ja ein richtiger Sturm im Wasserglas ! Danke für die vielen Informationen. Die haben mir aber nicht weitergeholfen.
Es geht schlicht um die Tatsache, dass meine Applikation optionale Tabellen erstellen soll. Aber nicht immer wieder, also soll geprüft werden, ob diese schon da ist. Wenn ja, dann brauche ich nichts zu tun…

Da ich mit QT 4 und CPP programmiere, habe ich eine programmierte Lösung gefunden, die das Problem umgeht.

ich nutze QSqlDatabase::tables() um eine Liste aller tables der Datenbank zu erhalten, und prüfe dann, ob die eine in der Liste da ist, wenn nein mache ich den SQL CREATE TABLE irgendwas …

Das klappt auch bei MySQL…

Trotzdem danke für die erschöpfende :slight_smile: Diskussion…

Gruß
Peter

Und weas genau klappt daran nun nicht in PostgreSQL?
Etwas konkretere Aussagen wären hilfreich.

Na CREATE TABLE … IF NOT EXIST … stand doch im OP

@ads
Wenn Du mich gemeint hast, dann ersten Post lesen, da steht es drin,

Zitat von mir selbst:

bei MySQL kann ich prüfen, ob eine Tabelle existiert, bevor ich ein CREATE TABLE mache. Leider gibt es das so nicht in PSQL. (CREATE TABLE table IF NOT EXIST …)

Wenn ich nicht gemeint war, dann vergesst diese Antwort

Gruß
Peter

Hoppla, Überschneidung mit symbiont :slight_smile:

Das braucht er nicht, da sein C+±Code schon prüft, ob die Tabelle da ist und den Befehl nur ausführt, wenn die Tabelle noch nicht vorhanden ist.

Also braucht er eigentlich weder unter MySQL noch unter PostgreSQL ein IF NOT EXISTS.

Ja hat er - aber schau dir nochmal seinen Link an mit der Pq/plsql-Funktion. Eine ähnliche könntest du dir auch erstellen, die dann auf dem DB-Server laufen wuerde. Dann musst du nicht im Client prüfen ob die Table existiert … Das wäre dann aber nicht mehr kompatibel mit der MySQL Lösung