Prüfung vor CREATE TABLE

Fragen und Probleme rund um die Abfragespache SQL.
peter999
Neuer Benutzer
Beiträge: 5
Registriert: Mi 24. Jun 2009, 10:54
Kontaktdaten:

Prüfung vor CREATE TABLE

Beitragvon peter999 » Mi 24. Jun 2009, 10:58

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

akretschmer
Erfahrener Benutzer
Beiträge: 7046
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitragvon akretschmer » Mi 24. Jun 2009, 11:03

peter999 hat geschrieben: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


Code: Alles auswählen

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


Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

symbiont
Erfahrener Benutzer
Beiträge: 1328
Registriert: Mo 17. Mär 2008, 11:45
Wohnort: NULL
Kontaktdaten:

Beitragvon symbiont » Mi 24. Jun 2009, 11:18

peter999 hat geschrieben:Hallo,

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

Gruß
Peter


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

Code: Alles auswählen

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

akretschmer
Erfahrener Benutzer
Beiträge: 7046
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitragvon akretschmer » Mi 24. Jun 2009, 11:27

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

Code: Alles auswählen

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




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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

symbiont
Erfahrener Benutzer
Beiträge: 1328
Registriert: Mo 17. Mär 2008, 11:45
Wohnort: NULL
Kontaktdaten:

Beitragvon symbiont » Mi 24. Jun 2009, 11:39

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 ..

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitragvon ads » Mi 24. Jun 2009, 12:21

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.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

symbiont
Erfahrener Benutzer
Beiträge: 1328
Registriert: Mo 17. Mär 2008, 11:45
Wohnort: NULL
Kontaktdaten:

Beitragvon symbiont » Mi 24. Jun 2009, 12:46

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 <boolean expression> ..

DROP ..
IF <boolean expression> ..

ALTER ..
IF <boolean expression> ..

wobei boolean expression dann auch wieder ein select statement enthalten koennte

das wäre mal was

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitragvon ads » Mi 24. Jun 2009, 12:54

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.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild



Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler



PostgreSQL Service & Support

symbiont
Erfahrener Benutzer
Beiträge: 1328
Registriert: Mo 17. Mär 2008, 11:45
Wohnort: NULL
Kontaktdaten:

Beitragvon symbiont » Mi 24. Jun 2009, 13:00

ads hat geschrieben:Dir ist der Unterschied zwischen CREATE und DROP schon klar, oder?

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

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitragvon ads » Mi 24. Jun 2009, 13:04

symbiont hat geschrieben:Muss das sein? Niemand zwingt Dich zu antworten.

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.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild



Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler



PostgreSQL Service & Support


Zurück zu „SQL“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste