SQL versehentlich spalten gelöscht, in struktur immer noch vorhanden

aceex

Cadet 4th Year
Registriert
März 2013
Beiträge
110
Hallo,

Ich brauche dringend Hilfe.
Ich habe da mein Forum (phpbb) und ich hab versucht einen mehrere Ränge-Mod zu installieren, was nicht geklappt hat. Ich musste davor ein paar spalten hinzufügen und wollte sie dann mit
Code:
DELETE FROM `phpbb_users` WHERE `user_rank2`;
löschen (kenne mich leider nicht mit MySQL aus) und jetzt hat er alle spalten eigentlich gelöscht aber wenn ich im Tab "Struktur" bin sind glaube ich alle noch vorhanden. kann ich die irgendwie wiederherstellen?

Freue mich über Antworten
 
Nur wenn du ein Backup deiner Datenbank vor deinem Gepfusche gemacht hast. Ein verantwortungsbewusster Administrator macht ja sicher a) regelmäßig Backups und b) zusätzliche Sicherungen bevor irgend welche Mods etc. eingespielt werden.
Bist du hingegen kein verantwortungsbewusster Administrator, dann hast du hoffentlich einen netten Hoster, der ebenfalls regelmäßige Backups macht.

Kleiner Tip für die Zukunft: Wenn du wissen willst, was ein "DELETE"-Statement so löschen könnte, schreib es vorher als "SELECT".
 
danke für deine Antwort. Hab mir jetzt ein Ticket für den Support geholt. Hoffe die können was dran machen. Bin bei "Hostinger".
 
Ohne Backup wird das nichts außer du hast en Hosted-Forum, die könnten sowas haben...

Wieso hast du denn kein Backup gemacht bzw. fummelst rum ohne zu wissen was du da machst?
 
Ich bin ein Newbie im Thema Webhosting und Administration. Mein Forum war ganz neu, deswegen ist das jetzt nicht so tragisch, aber ich habe schon einige Zeit beim einstellen verbracht.
 
Gerade als Newbie sollte man vor jedem Furz ein Backup machen. Zwar bauen auch erfahrene Administratoren und Entwickler mal ein "Oops", aber viel seltener als totale Laien.
Wenn dein Hoster kein Backup hat, dann sieh es als Lehrgeld. Du wirst jetzt hoffentlich nie wieder ein schreibendes oder gar löschendes SQL-Statement ausführen, wenn du nicht 100% genau weißt, was es dann tun wird.
 
aceex schrieb:
im Tab "Struktur" bin sind glaube ich alle noch vorhanden. kann ich die irgendwie wiederherstellen?

Nein. Du hast alle Table geleert, aber die Table selbst nicht gelöscht, der Befehl dazu wäre nämlich "drop". Wobei mir nicht ganz klar ist, wie du das mit dem obigen Befehl geschafft hast.

Analogie: Du hast einen Eimer ausgeschüttet. Den Eimer hast du allerdings noch.
 
Zuletzt bearbeitet:
OK danke. Ist schon wieder egal... Ich hab jetzt ein neues erstellt. Hoffe das ich schnelstens alle einstellungen wieder hab.
 
F_GXdx schrieb:
Wobei mir nicht ganz klar ist, wie du das mit dem obigen Befehl geschafft hast.

Ist doch ganz einfach: DELETE FROM `phpbb_users` WHERE `user_rank2`;
Die Where-Bedingung hat keinen Vergleichsoperator, im höchsten Fall prüft die Datenbank also, ob die Spalte user_rank2 überhaupt etwas enthält... evtl. nichtmal das.

Stells dir so vor: SELECT * FROM `fahrzeuge` WHERE `raeder`
Du würdest alles erhalten, vom Einrad über Segways bis hin zum Schwerlasttransporter mit 20 Achsen. Schlitten, Boote und Raketen würden hingegen wohl nicht erscheinen.
 
Ich habs gestern selbst ausprobiert, aber eine existierende Spalte in so einer Anweisung hat bei mir nicht zum Löschen geführt.

Angenommen, man hätte einen Table "users", die ein Attribut "rank" haben, warum sollte diese Abfrage zum löschen führen?
 
DELETE löscht dasselbe, was ein SELECT * anzeigen würde.
Wenn du SELECT * FROM `users` WHERE `rank`; ausführst, dann kriegst du alle Zeilen aus Users, bei denen `rank` eben gesetzt ist. Nenn es ein impliziertes "WHERE NOT(`rank`=NULL)" oder sowas.
 
Nach "WHERE" kommt laut Spec ein "predicate", und das ist definitert als ein Ausdruck, der true oder false sein kann.

Ein beliebiger Wert ist sicherlich nur für die wenigsten Datenbanken als true definiert (was alle Zeilen auswählt). Ich hab hier MySQL 5.5.16 und es geht nicht.

Gib mir doch bitte mal durch, welche DB sich bei dir so verhält. Würde mich interessieren. IMHO ist das nicht mal ein valider Ausdruck.

Edit:

Ich werd nicht ganz schlau draus. Bei manchen Feld-Typen funzt es doch, zB (big)int. Bei text/(var)char aber nicht.
 
Zuletzt bearbeitet:
Ich habs an einer Contao-Datenbank (MySQL Version Fragmichnicht, die von Debian 7) mit dem ´pid´ - Feld ausprobiert, das ist n Integer. Kann durchaus sein, dass es bei Varchar oder BLOB nicht geklappt hätte....

Warum es bei Integer-Feldern geht?
BOOL, BOOLEAN

These types are synonyms for TINYINT(1). A value of zero is considered false. Nonzero values are considered true:

http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Ein User-Rang wie beim TE ist sicherlich ein Integer.... Er hat also alles gelöscht, bei dem der Rang nicht 0 oder NULL ist.
 
Zurück
Oben