alter table
norbert
- datenbank
Guten Morgen,
in einer Tabelle soll durch ein Update eine neue Column eingefügt werden. Da man das Update mehrfach fahren kann, will ich gewährleisten, dass das ALTER TABLE nur dann ausgeführt wird, wenn die Column noch nicht vorhanden ist. Ohne eine Function zu schreiben wird es wohl nicht gehen? Aber an der probiere ich schon ne Stunde herum. SHOW COLUMNS bringt mir zwar eine Liste, aber wie verarbeite ich die? Ein SELECT wäre da besser. Z.B.
select * from information_schema.COLUMNS where table_name='t500' and column_name='C5000'
Damit komme ich aber auch nicht weiter, weil ich die Werte von allen Datenbanken bekomme und ich auch nicht weiss, in welcher DB der User die t500 angelegt hat. Kann mir da jemand einen Rat geben?
Gruß Norbert
Da man das Update mehrfach fahren kann
Da sehe ich den Fehler. Ein solches Update sollte man nur genau einmal machen können. Dazu könnte man sich in einer extra Tabelle speichern, welches Update schon passiert ist.
Es gibt so gut wie kein Update an einer Datenbank, das keine Probleme macht wenn es mehrfach ausgeführt wird. Meistens ist dabei sogar eine bestimmte Reihenfolge einzuhalten. Mit Tests ob irgendwas schon vorhanden ist kannst du das Chaos zwar verringern aber nicht abschalten.
Danke für die schnelle Antwort. Das muss ich mir für später vormerken. Im Moment brennt das Problem aber etwas unter den Nägeln und das Update muss erst mal raus. Ich möchte nur einen Crash verhindern, wenn es versehentlich ein zweites Mal ausgeführt wird. Hab aber immer noch nicht gefunden, wie ich abfragen kann, ob das Feld schon vorhanden ist.
Hi!
in einer Tabelle soll durch ein Update eine neue Column eingefügt werden. Da man das Update mehrfach fahren kann, will ich gewährleisten, dass das ALTER TABLE nur dann ausgeführt wird, wenn die Column noch nicht vorhanden ist.
Wenn die Column bereits existiert, gibt es eine Fehlermeldung. Fehlerzustände sollte ja generell nicht unbeachtet gelassen werden. Du könntest diese Meldung auswerten und daraufhin einen anderen Weg im Code einschlagen.
Lo!
Du könntest diese Meldung auswerten und daraufhin einen anderen Weg im Code einschlagen.
Das ist ein Lichtblick. Kannst Du mir sagen, wie ich den Fehler behandeln muss? Ich bin noch ein Anfänger und bisher wurden meine Scripte bei einem Fehler immer sofort beendet.
Mahlzeit norbert,
Das ist ein Lichtblick. Kannst Du mir sagen, wie ich den Fehler behandeln muss?
Zeige doch mal die relevanten Teile Deines Codes.
Ich bin noch ein Anfänger und bisher wurden meine Scripte bei einem Fehler immer sofort beendet.
Das liegt dann aber daran, dass Du genau das genau so programmiert hast (Beachte Zitat 1282!).
MfG,
EKKi
Hi!
Du könntest diese Meldung auswerten und daraufhin einen anderen Weg im Code einschlagen.
Das ist ein Lichtblick. Kannst Du mir sagen, wie ich den Fehler behandeln muss? Ich bin noch ein Anfänger und bisher wurden meine Scripte bei einem Fehler immer sofort beendet.
Ich weiß ja nicht, um welches System es sich handelt. Üblicherweise geben die Funktionen über ihren Rückgabewert bekannt, ob alles richtig war oder nicht. Welcher Wert wofür steht, steht in der Dokumentation. Eine Fallunterscheidung macht man dann mit einem if-Konstrukt. Andere Systeme funktionieren mit Exceptions, da gilt es, diese abzufangen.
Unter PHP-Anfängern ist sehr verbreitet ein "or die()" anzuhängen. Das ist schnellste aber auch "schmutzigste" Weise, auf Fehler zu reagieren. Wenn du das so verwendest, dann lass den Teil weg und werte den Rückgabewert über if aus.
Lo!
Das ist lieb von euch, dass ihr mir bei meinem Problem so helft! Danke!
Ich verwende MySql 5.0 (soll aber auch unter 5.1 funktionieren). Das Betriebssystem ist Windows XP. Zu meiner Schande muss ich gestehen, dass noch gar kein Code fertig ist. Wie gesagt: ich versuche:
if select count(*) from information_schema.columns where table_name='t500' and column_name='C5009' and table_schema='xyz'=0 then
ALTER TABLE t500 ADD COLUMN 'C5009' ...
Das Problem dabei ist, dass ich die DB (xyz) nicht kenne, da sie jeder User nach Belieben frei wählen konnte. Ich könnte auch
show columns from t500
anwenden. Dann steht die DB fest. Aber ich weiss nicht, wie ich das Ergebnis weiter verarbeiten muss.
Hi,
Du könntest diese Meldung auswerten und daraufhin einen anderen Weg im Code einschlagen.
Das ist ein Lichtblick. Kannst Du mir sagen, wie ich den Fehler behandeln muss?
Da du es versäumt hast, den Namens deines DBMS nebst Version zu nennen (obwohl du bei Auswahl des Themenbereiches Datenbank explizit darauf hingewiesen wirst!) kann ich jetzt nur mal annehmen, dass du MySQL verwendest.
Da wertest du nach der Operation mysql_error aus (bzw. dessen Äquivalent bei Nutzung von MySQLi), und schaust dir die Fehlernummer an - wenn es genau die ist, die in dem Fall auftritt, dass eine Spalte hinzugefügt werden soll, obwohl sie bereits existiert, dann reagierst du entsprechend speziell. Die Fehlernummer bekommst du heraus, in dem du den Fall mal explizit provozierst. Und dann schlägst du sie noch kurz in der MySQL-Doku nach, um sicherzugehen, dass es auch wirklich die richtige war, und kein zufällig dabei aufgetretener anderer Fehler.
MfG ChrisB
Da du es versäumt hast, den Namens deines DBMS nebst Version zu nennen (obwohl du bei Auswahl des Themenbereiches Datenbank explizit darauf hingewiesen wirst!) kann ich jetzt nur mal annehmen, dass du MySQL verwendest.
Da handelt es sich sicher um ein Missverständnis, denn weiter oben habe ich geschrieben:
Ich verwende MySql 5.0 (soll aber auch unter 5.1 funktionieren). Das Betriebssystem ist Windows XP
Das Problem habe ich mit eurer Hilfe jetzt gelöst. Vielen Dank an alle.
Gruß Norbert
Mahlzeit norbert,
in einer Tabelle soll durch ein Update eine neue Column eingefügt werden.
Das scheint Dein Problem zu sein: Dein Datenbankdesign ist defekt.
Wenn aufgrund von Änderungen/Ergänzungen von *Daten* die *Struktur* geändert werden muss, ist irgendwas bei der Konzeption grundlegend falsch gelaufen ...
MfG,
EKKi
Das scheint Dein Problem zu sein: Dein Datenbankdesign ist defekt.
Danke. Ja, ich ärgere mich auch schon, dass mir das passiert ist. Aber nun kann ich deswegen nicht das ganze Projekt wegschmeissen.