MySQL IGNORE ohne Wirkung

Lokutos

$_POST => dev/null
ID: 298414
L
15 März 2008
362
39
MYSQL version 5.5.11


INSERT IGNORE INTO funktioniert
ALTER IGNORE TABLE funktioniert nicht

Folgender Befehl:
Code:
ALTER IGNORE TABLE `vms_userdaten` ADD `sutosurfsort` ENUM( 'aufendhalt', 'verdienst', 'reload', 'zeitverdienst' ) NOT NULL DEFAULT 'verdienst',
ADD `sutosurfsorta` ENUM( 'asc', 'desc' ) NOT NULL DEFAULT 'desc';
Wird abgebrochen mit der meldung:
Code:
MySQL meldet: Dokumentation
#1060 - Duplicate column name 'sutosurfsort'

Sollte aber durch das IGNORE einfach übersprungen werden.
Suche aktuell nach einer Idee wo das Problem zu Lokalisieren ist.

Besten dank
LKTechnik
 
Zuletzt bearbeitet:
IGNORE ist eine MySQL-Erweiterung zum SQL-Standard. Sie steuert, wie ALTER TABLE funktioniert, wenn Dubletten eindeutiger Schlüssel in der neuen Tabelle vorhanden sind oder (bei aktiviertem striktem Modus) Warnungen auftreten. Wenn IGNORE nicht angegeben ist, wird der Vorgang bei Auftreten von Schlüsseldubletten abgebrochen, und ein Rollback wird durchgeführt. Ist IGNORE angegeben, dann wird nur der erste von mehreren Datensätzen mit Dubletten eindeutiger Schlüssel verwendet. Die übrigen betroffenen Datensätze werden gelöscht. Falsche Werte werden auf den nächstliegenden zulässigen Wert gesetzt.
Quelle: https://dev.mysql.com/doc/refman/5.1/de/alter-table.html

Fazit: IGNORE schützt dich nicht vor Bullshit-Statements :mrgreen:, sondern nur vor doppelten Schlüsseln, wenn du durch das ALTER neue Schlüssel zur Tabelle hinzufügst, die das Eindeutigkeitskriterium kaputt machen würden.

Prüfe vorher, ob die Spalte vorhanden is, wenn du dir nicht sicher bist (normal solltest du das aber schon wissen 8O).
 
Gibt es ev. eine Alternative?

Es soll möglich sein die komplette sql Datei auszuführen ohne Abbruch.
Nicht immer sind die kundentabellen auf dem gleichen stand.
Es ist mir daher nicht möglich zu sagen ob eine Spalte bereits existiert, oder nicht.
Ich wollte daher fragen ob es eine Möglichkeit gibt das eine Datei zuende ausgeführt wird und es ignoriert wen die Spalte schon vorhanden ist.

Besten Dank
 
Das Beste ist, wenn man in seiner Datenbank eine Version mitführt und mit jedem Release auch eine neue SQL-Datei für den Update anlegt. Vor der Ausführung prüft man dann die Version und spielt nur die SQL-Dateien ein, die für die vorliegende Version noch nötig sind. Das macht zwar mehr Aufwand, aber man bekommt solche Probleme, wie du sie jetzt hast, nicht. Im Nachhinein wüsste ich jetzt aber leider keine Möglichkeit, das Script auszuführen. Du könntest den Befehl höchstens einzelne Schritte ausführen (also jede Spalte extra anfügen) und die Fehler per PHP (oder mit was auch immer du die Scripte ausführst) abfangen. Ist zwar auch nicht sehr elegant, aber sollte möglich sein.

stumpi
 
Gibt es ev. eine Alternative?
Ordentlich programmieren? :mrgreen:
Nicht immer sind die kundentabellen auf dem gleichen stand.
Und wie willst du dann ein einheitliches Script schreiben, wenn du zig verschiedene DB-Strukturen hast? Das is ja schon mal ein logisches Problem.

Ansatz - wie schon erwähnt - wäre, zu prüfen, ob die Spalte da is und falls nicht, sie eben anzulegen. Das kannst du aber nicht mit einem SQL-Script machen, sondern brauchst irgendwas drumrum (z.B. ein Setup-Script in PHP), was die aktuelle DB-Struktur einliest und entscheidet, wie das ALTER TABLE-Statement aussehen soll.
Du könntest den Befehl höchstens einzelne Schritte ausführen (also jede Spalte extra anfügen) und die Fehler per PHP (oder mit was auch immer du die Scripte ausführst) abfangen.
Dann kannst du aber auch gleich wieder die Taktik "Ordentlich programmieren" anwenden.