SQL: 1064 - mybb_threadsubscriptions - Druckversion +- MyBB.de Forum (https://www.mybb.de/forum) +-- Forum: Archiv (https://www.mybb.de/forum/forum-57.html) +--- Forum: MyBB 1.6.x (https://www.mybb.de/forum/forum-58.html) +---- Forum: Allgemeiner Support (https://www.mybb.de/forum/forum-59.html) +---- Thema: SQL: 1064 - mybb_threadsubscriptions (/thread-17662.html) |
RE: SQL: 1064 - mybb_threadsubscriptions - happyspeedy - 14.01.2011 Hmm... , das bedeutet es gibt keine andere Möglichkeit, als jede einzelne ID, die mir dann jemand melden müsste, rauszusuchen und dann zu beseitigen? Oder gibt es einen MySQL Check & Repair Syntax womit ich das ggf. automatisch reparieren lassen könnte??? Und wäre meine Lösung so richtig??? Code: DELETE FROM mybb_threadsubscriptions WHERE sid <1 oder Code: DELETE FROM mybb_threadsubscriptions WHERE sid <2670 Jetzt nur als Beispiel, zu meinen Fallbeschreibungen. Oder könnte ich alle auf einen Schlag auch besetigen? Oder wie finde ich die richtige ID, bin ein wenig damit überfordert leider... RE: SQL: 1064 - mybb_threadsubscriptions - StefanT - 14.01.2011 Es fehlen ja wahrscheinlich nur einzelne IDs zwischendrin, mit so einem einfachen Query kannst du die nicht zielgerichtet löschen. RE: SQL: 1064 - mybb_threadsubscriptions - Mithrandir - 14.01.2011 Nur mal so laut gedacht (ich habe das Firmen-interne Forum momentan nicht "griffbereit"): Würde es mit einer Unterabfrage gehen? Sinngemäß also: Code: DELETE FROM mybb_threadsubscriptions WHERE tid Not in(SELECT [ThreadIdFeld] from [ThreadTabelle]) Die Platzhalter in den eckigen Klammern müssen natürlich noch angepasst werden. Wer DELETE-Abfragen so absetzt, sollte sich über das Risiko bewusst sein (Backup wird empfohlen) - sicherheitshalber könnte man sich auch erst einmal das Ergebnis von Code: SELECT * FROM mybb_threadsubscriptions WHERE tid Not in(SELECT [ThreadIdFeld] from [ThreadTabelle]) Unterabfragen sind meist ziemlich lahm, deshalb könnte das ein wenig dauern, je nach Umfang der beteiligten Tabellen. RE: SQL: 1064 - mybb_threadsubscriptions - StefanT - 14.01.2011 Bei jedem Datensatz sämtliche Themen zu laden, killt dir den Server. Aber die Richtung ist schon gut. RE: SQL: 1064 - mybb_threadsubscriptions - thebod - 14.01.2011 Manuell per Script die Subscriptions durchlaufen, tid checken und sofern nicht vorhanden Löschen. (Dabei aber nicht sid=[aktuelle subscription id] sondern tid=[nicht vorhandene tid], damit sparst du dir einiges.) Btw.: < 1 ist "kleiner eins", sprich 0 oder weniger Wird nicht helfen bei IDs RE: SQL: 1064 - mybb_threadsubscriptions - happyspeedy - 14.01.2011 Nun, irgendwie verstehe ich gerade nur noch Bahnhof, das ist ja richtig ärgerlich, verstehe nicht, warum so ein Fehler überhaupt entsteht in der Datenbank. RE: SQL: 1064 - mybb_threadsubscriptions - Mithrandir - 14.01.2011 @Stefan; War ja auch schon meine Vermutung (ich hatte meinen Beitrag kurz vorher noch angepasst). Dann würde ich eine entsprechende "Inkonsistenzabfrage" mittels JOIN basteln - die Ergebnisse (ids) daraus per Komma getrennt ins IN() ("NOT" in der obigen Syntax muss dann enfernt werden!) packen. Eine Inkonsistenzabfrage in MS Access (also Jet-SQL) zusammengeklickt sieht so aus - MySQL wird's vielleicht anders benötigen: Code: SELECT mybb_threadsubscriptions.tid Auf jeden Fall ist das ein Bugreport wert: Foreign-Keys sollten so nicht übrig bleiben können. Aber vermutlich ist das der Kompatibilität zu älteren MySQL-Versionen geschuldet. RE: SQL: 1064 - mybb_threadsubscriptions - Mithrandir - 15.01.2011 Ich hab's mal lokal mit MyBB 1.6 getestet. Ich übernehme keine Garantie für absolut richtige Funktion - wäre schön, wenn einer der Profis hier das noch testen und ggf. korrigieren könnte. Wir gehen davon aus, dass das Problem dadurch hervorgerufen wird, dass es noch Abonnements gibt, die auf gelöschte Threads verweisen. Wir müssen also zunächst die IDs der nicht mehr vorhandenen Threads ermitteln (s. 1.), diese IDs exportieren wir (2.) und benutzen diese in einer Löschabfrage (3.). 1.) Ermitteln der Abos, die auf IDs nicht mehr vorhandener Threads verweisen Im phpmyadmin folgende Abfrage abschicken: Code: SELECT mybb_threadsubscriptions.tid 2.) Export der ermittelten IDs Das Ergebnis aus 1.) exportieren mittels Klick auf "Exportieren". In der Folge auf "CSV" klicken, danach bei den Optionen einige Felder leeren (s. [Leer]) und den Zeilentrenner von "AUTO" auf "," setzen: Code: Felder getrennt mit [Leer] (steht standardmäßig auf ";") Man erhält eine durch Komma getrennte Liste der IDs (Beispiel: 2,4,7,), diese kopiert man bis auf das letzte Komma, also hat man z.B. 2,4,7 in der Zwischenablage. 3.) Löschabfrage erstellen und abschicken: Die unter 2.) kopierte Liste bei [HierDeineListe] einfügen und Abfrage ausführen: Code: DELETE FROM mybb_threadsubscriptions WHERE tid IN([HierDeineListe]) Code: DELETE FROM mybb_threadsubscriptions WHERE tid IN(2,4,7) RE: SQL: 1064 - mybb_threadsubscriptions - happyspeedy - 17.01.2011 Ich hab noch eine andere Idee, vielleicht ist ja die Lösung einfacher, wie lösche ich Abonnements ab einem bestimmten Datum von allen Benutzern? Also quasi Beispiel von 2005 - 2004 ??? So wäre das Problem sicherlich auch gelöst? RE: SQL: 1064 - mybb_threadsubscriptions - StefanT - 17.01.2011 Das kann man nicht sicher sagen, es können ja zwischendrin Themen fehlen... |