Page 1 of 1
gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 22:09
by fulltilt
Ich habe hier eine ca. 24 MB grosse DB und muss einige Einträge (ca. 10000) in einer Tabelle ändern.
Die Struktur sieht so aus:
DB: in der Tabelle pro_seller in der Spalte payment_options sollen alle Einträge mit "Banktransfer" in "18" geändert werden.
Ich weiss nun nicht wie ich das in phpmyadmin umsetzen kann und bräuchte dafür einen Befehl wie z.B.
ALTER TABLE `pro_auctions` CHANGE `Banktransfer` `18` ;
Das kriege ich nicht zusammen ...
Kann jemand helfen?
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 22:21
by oxygen
Du willst nicht die Tabelle sondern die Einträge ändern. vgl
UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` = 'Banktransfer'
das ist nun wirklich nicht schwer rauszufinden.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 22:27
by fulltilt
Danke - Das Problem dabei ist, das hinter dem Banktransfer noch ein <br> und ein anderer Entrag kommt.
Geht das dann überhaupt?
oxygen wrote:Du willst nicht die Tabelle sondern die Einträge ändern. vgl
UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` = 'Banktransfer'
das ist nun wirklich nicht schwer rauszufinden.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 22:30
by oxygen
Ja.
UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` LIKE 'Banktransfer%'
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 22:33
by fulltilt
Hi oxygen,
Also es wird dann nur Banktransfer geändert oder geht der Rest dahinter mit weg durch %?
oxygen wrote:Ja.
UPDATE TABLE `pro_auctions` SET `payment_options` = '18' WHERE `payment_options` = 'Banktransfer%'
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 22:43
by Joe User
fulltilt wrote:Das Problem dabei ist, das hinter dem Banktransfer noch ein <br> und ein anderer Entrag kommt.
Ich hoffe, die Anwendung filtert das Feld gut genug -> XSS
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:04
by fulltilt
Wenn ich es so ausführe, kommt es zu keiner Fehlermeldung .. aber geändert hat sich nichts ...
Code: Select all
update pro_auctions set payment_options = '18' where payment_options = 'Banktransfer%';
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:16
by Joe User
fulltilt wrote:Wenn ich es so ausführe, kommt es zu keiner Fehlermeldung .. aber geändert hat sich nichts ...
Du versuchst einen Teilstring zu ersetzen, dass geht AFAIK nicht per SQL. Diese Aufgabe (auslesen->ersetzen->einfügen) muss eine externe Anwendung übernehmen.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:20
by fulltilt
hm ... und direkt über die shell?
Ich könnte auch einen dump erstellen und z.b. mit Kate die Stellen ersetzen ... das Teil kann ich dann wg. der Grösse nicht wieder mit PMA einspielen ...
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:30
by fulltilt
Kate = Editor
Damit könnte das mit dem ersetzen klappen ...
Das wird nur ein Riesen Aufwand und das projket muss schnel wieder online
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:39
by daemotron
Dann würde ich lieber sed auf den Dump drauf loslassen...
Code: Select all
sed 's/Banktransfer/18/' -i dumpfile.sql
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:44
by Joe User
Kate ist ein in KDE integrierter Editor.
Ein paar Zeilen PHP/Perl/Python/etc. reichen völlig und nebenbei umgehst Du das Risiko einer unerwarteten Zeichensatz-Konvertierung durch den Editor.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:47
by apr
Code: Select all
UPDATE `pro_seller` SET `payment_options` = INSERT(`payment_options`, 1, 12, '18') WHERE `payment_options` LIKE 'Banktransfer%';
Schätze das tuts, wenn 'Banktransfer' am Anfang des Strings steht sonst must da noch ein INSTR reinbasteln.
edit: hupsa ein % vergessen...
edit2: ähm ich bin nun etwas verwirrt, was willst du genau anstellen? Das da oben ändert alle Datensätze ab, die mit "Banktransfer" beginnen und ersetzt "Banktransfer" durch "18".
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-09 23:50
by Joe User
jfreund wrote:Dann würde ich lieber sed auf den Dump drauf loslassen...
Code: Select all
sed 's/Banktransfer/18/' -i dumpfile.sql
Genau so will er es ja nicht haben, sondern:
Alt: Banktransfer XX<br>foobar
Neu: Banktransfer 18<br>foobar
Quick&Dirty&Untestet:
Code: Select all
sed 's/(Banktransfers)[0-9][0-9](<br>.*)/1182/g' -i dump.sql
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 00:44
by fulltilt
Ist schon richtig ...
Alt "Banktransfer<br>" > Neu > "18"
Das Problem dabei ist das nachher das <br> ein Komma werden soll.
Es geht um Zahlungsarten davon gibts aber 6 und die sind alle in den spalten unterschiedlich >
Banktransfer<br>
oder
Banktransfer<br>Nachnahme<br>
Nachnahme<br>Visa<br>
Das muss nachher dann so aussehen:
18
oder
18,19
18,21
hinter der letzten Zahl darf kein Komma mehr sein ...
Geht das überhaupt?
apr wrote:Code: Select all
UPDATE `pro_seller` SET `payment_options` = INSERT(`payment_options`, 1, 12, '18') WHERE `payment_options` LIKE 'Banktransfer%';
Schätze das tuts, wenn 'Banktransfer' am Anfang des Strings steht sonst must da noch ein INSTR reinbasteln.
edit: hupsa ein % vergessen...
edit2: ähm ich bin nun etwas verwirrt, was willst du genau anstellen? Das da oben ändert alle Datensätze ab, die mit "Banktransfer" beginnen und ersetzt "Banktransfer" durch "18".
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 01:08
by Joe User
fulltilt wrote:Alt "Banktransfer<br>" > Neu > "18"
Wenn Alles nach dem <br> auch entsorgt werden soll:
Code: Select all
UPDATE pro_seller SET payment_options = '18' WHERE payment_options LIKE 'Banktransfer%';
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 01:16
by fulltilt
Danke,
Das Problem dabei ist das nachher das <br> ein Komma werden soll.
Es geht um Zahlungsarten von Usern davon gibts aber 6 und die sind alle in den Zeilen unterschiedlich >
Banktransfer<br>
oder
Banktransfer<br>Nachnahme<br>
Nachnahme<br>Visa<br>
Das muss nachher dann so aussehen:
18
oder
18,19
18,21
hinter der letzten Zahl darf kein Komma mehr sein ...
Geht das überhaupt?
Wenn nicht müsste ich wirklich alles danach entsorgen ...
Das ist eine Online Auktion die ein Upgrade bekommt ... leider ist das nicht ganz kompatibel. Ich will aber die Scripte nicht umschreiben sonst passt beim nächsten Upgrade gar nix mehr.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 09:16
by apr
Probiers mit:
- a) 'Banktransfer' => '18'
- b) 'Nachname' => '19'
- c) 'Visa' => '21'
- d) '<br>' => ','
- e) Letztes ',' entfernen.
a)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Banktransfer', '18');
b)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Nachname', '19');
c)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Visa', '21');
d)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, '<br>', ',');
e)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = SUBSTRING(`pro_seller`, 1, CHAR_LENGTH(`pro_seller`)-1) WHERE `pro_seller` LIKE '%,'
Wenn man mag, sollte man auch die Replace schachteln können um ein Query zu bekommen - zumindest a-d geht Problemlos. Wenn e auch mit in einen einzigen Query soll, dann wirds länger (mit IF prüfen ob das letzte Zeichen ein , ist und bei bedarf noch rausschneiden).
Edit: Achso, evtl. bei a-d noch "WHERE `payment_oprions` LIKE '%Ersetzung%'" mit reinnehmen. Ich schätze Volltextsuchen sind schneller als 4x jeden Datensatz zu ändern.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 09:51
by fulltilt
Danke - sehr beeindruckend 8O
Ich werde das gleich mal mit einer Kopie testen.
apr wrote:Probiers mit:
- a) 'Banktransfer' => '18'
- b) 'Nachname' => '19'
- c) 'Visa' => '21'
- d) '<br>' => ','
- e) Letztes ',' entfernen.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 10:17
by Joe User
fulltilt wrote:Das ist eine Online Auktion die ein Upgrade bekommt
Hoffentlich ist die neue Version sicherer als die Alte. Cross-Site-Scripting ist gerade in diesem Bereich nicht zu unterschätzen...
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 10:49
by fulltilt
Das Script wurde komplett neugeschrieben und auch endlich Indexe erstellt. Daher treten beim Upgrade diese Probleme auf die ich nun nach und nach hinbiegen muss. Eine Neuinstallation geht nicht, weil ich sonst viele Mitglieder verliere ...
Ich habe zum Upgraden eine Kopie paralell installiert und bis auf die obige Sache, läuft soweit alles ... mehr oder weniger :-)
Joe User wrote:fulltilt wrote:Das ist eine Online Auktion die ein Upgrade bekommt
Hoffentlich ist die neue Version sicherer als die Alte. Cross-Site-Scripting ist gerade in diesem Bereich nicht zu unterschätzen...
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 11:49
by Joe User
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 12:09
by fulltilt
O.K. alles klar. Bei diesem Script gab es bislang noch keine Probleme was die Sicherheit angeht, bis auf ein Spamproblem über den Mailer .. was behoben ist.
Was die Änderung betrifft, hat alles 100% geklappt bis auf das letzte Zeichen.
Re: gelöst: mysql Einträge per Befehl ändern
Posted: 2007-08-10 12:13
by fulltilt
@ apr >
Hut ab :-)
Das hat alles 100% geklappt bis auf das letzte Komma und das ging jetzt sensationell schnell - wow.
Du hast mir echt Mega weitergeholfen und daher bedanke ich mich mit grösstem Respekt 8)
apr wrote:Probiers mit:
- a) 'Banktransfer' => '18'
- b) 'Nachname' => '19'
- c) 'Visa' => '21'
- d) '<br>' => ','
- e) Letztes ',' entfernen.
a)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Banktransfer', '18');
b)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Nachname', '19');
c)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, 'Visa', '21');
d)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = REPLACE(`payment_options`, '<br>', ',');
e)
Code: Select all
UPDATE `pro_seller` SET `payment_options` = SUBSTRING(`pro_seller`, 1, CHAR_LENGTH(`pro_seller`)-1) WHERE `pro_seller` LIKE '%,'
Wenn man mag, sollte man auch die Replace schachteln können um ein Query zu bekommen - zumindest a-d geht Problemlos. Wenn e auch mit in einen einzigen Query soll, dann wirds länger (mit IF prüfen ob das letzte Zeichen ein , ist und bei bedarf noch rausschneiden).
Edit: Achso, evtl. bei a-d noch "WHERE `payment_oprions` LIKE '%Ersetzung%'" mit reinnehmen. Ich schätze Volltextsuchen sind schneller als 4x jeden Datensatz zu ändern.