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 ?
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.
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 …
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.
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
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.
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.
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 …
@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
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