CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
29.03.2013, 13:28:23
|
Anfänger
|
|
Registriert seit: Mar 2013
Alter: 53
Beiträge: 6
|
|
Delete Problem
Hallo zusammen.
Bist jetzt habe ich alle SQL Abfragen/Statements immer mittels try and error hinbekommen. Mit einer delete Anweisung habe ich aber Probleme. Ich habe es auf verschiedene Weisen probiert und trotzdem kommt jedesmal ein Fehler. Wenn ich aus dem delete ein select * mache, läuft die Abfrage ohne Fehler.
hier die verschiedenen Varianten:
1. mein Favorit, da ohne Schleife aufgebaut, Werte für WHERE aus Array
DELETE FROM `test`.`prod` p
where (p.`PROD_SA`*1000000 + p.`PROD_PA`) in (2013006313,2013006314,2013006315) )
2. 3 einzelne Delets
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8471 ;
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8470 ;
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8469 ;
3. mit where über 2 Spalten
DELETE FROM `test`.`prod`
WHERE (`prod`.`PROD_SA` = 2013 AND `prod`.`PROD_PA` = 6315) or
(`prod`.`PROD_SA` = 2013 AND `prod`.`PROD_PA` = 6314) or
(`prod`.`PROD_SA` = 2013 AND `prod`.`PROD_PA` = 6313)
4. mit subselect
DELETE FROM `test`.`prod` p
WHERE p.`prod_id` in
(
select pp.`PROD_ID` from `test`.`prod` pp
where (pp.`PROD_SA`*1000000 + pp.`PROD_PA`) in (2013006313,2013006314,2013006315)
)
bei allen Varianten kommt folgende Fehlermeldung, aus der der Fehler nicht zu erkennen ist:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ...
Das muß ein grundsätzlicher Syntaxfehler sein. Ich bin auch nach dem Studium des MySQL Handbuchs nicht schlauer. Was hab ich übersehen?
Ein Rechteproblem kann ich ausschließen, Recht für Delete gesetzt und an anderer Stelle klappt es auch mit dem Delete.
Grüße,
Marc
|
29.03.2013, 14:56:22
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 16
Beiträge: 2.269
|
|
AW: Delete Problem
Zitat:
for the right syntax to use near ...
|
entweder hast du schwachsinniger Weise das wichtigste abgeschnitten, oder es ist wirklich der Punkt gemeint.
Also:
Du könntest mal Testcode zeigen, wie du die Verbindung aufbaust usw..
Auch das CREATE Statement wäre von interesse.
Ohne ist das nicht einzugrenzen.
|
29.03.2013, 19:04:26
|
|
Member
|
|
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 36
Beiträge: 586
|
|
AW: Delete Problem
Moin moin!
Es ist recht schwer dein Problem nachzuvollziehen, wenn man nur einen Teil der Fehlermeldung kennt, nicht weiß zu welcher Abfrage sie gehört und auch nicht das ausführende Script kennt. Außerdem verstehe ich die Zusammenhänge zwischen den einzelnen Abfragen nicht. Warum sieht eine einzelne Abfrage wie folgt aus
Code:
DELETE FROM `test`.`prod` p
where (p.`PROD_SA`*1000000 + p.`PROD_PA`) in (2013006313,2013006314,2013006315) )
während drei Abfragen so aussehen:
Code:
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8471 ;
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8470 ;
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8469 ;
Was spricht gegen folgende Abfrage:
Code:
DELETE FROM `prod` WHERE `prod`.`PROD_ID` IN (8471, 8470, 8469);
Liebe Grüße
Andreas
|
30.03.2013, 06:42:17
|
Anfänger
|
|
Registriert seit: Mar 2013
Alter: 53
Beiträge: 6
|
|
AW: Delete Problem
Guten Morgen.
@DokuLeseHemmung
Die Verbindung zu Datenbank schließe ich aus, da der Select ja ohne Probleme funktioniert.
CREATE TABLE `test`.`prod` ( `PROD_ID` int( 11 ) NOT NULL auto_increment ,
`PROD_PA` int( 11 ) NOT NULL ,
`PROD_SA` smallint( 4 ) default NULL ,
`PROD_ME` int( 11 ) default NULL ,
`PROD_DA` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP ,
`PROD_US` varchar( 20 ) collate latin1_german1_ci NOT NULL ,
`PROD_OR` varchar( 20 ) collate latin1_german1_ci NOT NULL ,
`PROD_BA_1` varchar( 20 ) collate latin1_german1_ci default NULL ,
`PROD_BA_2` varchar( 20 ) collate latin1_german1_ci default NULL ,
`PROD_BA_3` varchar( 20 ) collate latin1_german1_ci default NULL ,
`PROD_BA_4` varchar( 20 ) collate latin1_german1_ci default NULL ,
`PROD_BA_5` varchar( 20 ) collate latin1_german1_ci default NULL ,
`PROD_BA_6` varchar( 20 ) collate latin1_german1_ci default NULL ,
PRIMARY KEY ( `PROD_ID` ) ,
UNIQUE KEY `SaisonPartie` ( `PROD_SA` , `PROD_PA` ) ) ENGINE = MyISAM DEFA[...]
Die Fehlermeldungen waren alle 4 in etwa so, dass man (ich) daraus keine Lösung ablesen konnte. Als Beispiel für die Fehlermeldung nehme ich mal die Variante 1.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where (p.`PROD_SA`*1000000 + p.`PROD_PA`) in (2013006313,201300' at line 5
Ich habe die Abfrage in phpmyadmin soweit auseinandergezogen, dass in Zeile 5 nur das Wort WHERE stand. Davor und danach war eine Leerzeile. Darf man in einer DELETE-Where Klausel keine Rechenoperation durchführen?
@Socrates
Die verschiedenen Varianten sind aus meiner Verzweiflung heraus entstanden. Ich konnte es nicht verstehen, warum eine Abfrage als DELETE ... nicht geht, dieselbe Abfrage aber mit SELECT * ... ohne Probleme ausgeführt wird.
Zur Variante 2: Ich packe alle 3 Zeilen in die Variable $delete jeweils mit Semikolon am Ende.
Die Ausführung ist bei allen Varianten über die Zeile:
$result = mysql_query($delete) or die("Löschen fehlgeschlagen: " . mysql_error());
Zu Deinem Vorschlag:
Ich habe diese Werte 2013006313,2013006314,2013006315 bereits aus dem Array in eine Variable geschrieben. Ich kann das auch mit dem anderen Wert machen. Werde ich testen und berichten.
Vielen Dank für eure Tipps. Ich hoffe, dass bringt etwas Licht in mein Dunkel.
Marc
Geändert von undnbsp (30.03.2013 um 07:04:39 Uhr)
|
30.03.2013, 16:12:38
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 76
Beiträge: 4.001
|
|
AW: Delete Problem
Zitat:
Zitat von undnbsp
Mit einer delete Anweisung habe ich aber Probleme. Ich habe es auf verschiedene Weisen probiert und trotzdem kommt jedesmal ein Fehler. Wenn ich aus dem delete ein select * mache, läuft die Abfrage ohne Fehler.
hier die verschiedenen Varianten:
1. mein Favorit, da ohne Schleife aufgebaut, Werte für WHERE aus Array
Code:
DELETE FROM `test`.`prod` p
where (p.`PROD_SA`*1000000 + p.`PROD_PA`) in (2013006313,2013006314,2013006315) )
2. 3 einzelne Delets
Code:
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8471 ;
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8470 ;
DELETE FROM `test`.`prod` WHERE `prod`.`PROD_ID` = 8469 ;
3. mit where über 2 Spalten
DELETE FROM `test`.`prod`
Code:
WHERE (`prod`.`PROD_SA` = 2013 AND `prod`.`PROD_PA` = 6315) or
(`prod`.`PROD_SA` = 2013 AND `prod`.`PROD_PA` = 6314) or
(`prod`.`PROD_SA` = 2013 AND `prod`.`PROD_PA` = 6313)
4. mit subselect
Code:
DELETE FROM `test`.`prod` p
WHERE p.`prod_id` in
(
select pp.`PROD_ID` from `test`.`prod` pp
where (pp.`PROD_SA`*1000000 + pp.`PROD_PA`) in (2013006313,2013006314,2013006315)
)
bei allen Varianten kommt folgende Fehlermeldung, aus der der Fehler nicht zu erkennen ist:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ...
|
Verständlich:
Zitat:
DELETE FROM `test`.`prod` p
|
Zitat:
Das muß ein grundsätzlicher Syntaxfehler sein. Ich bin auch nach dem Studium des MySQL Handbuchs nicht schlauer. Was hab ich übersehen?
|
Das:
Code:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
MySQL will im FROM weder datenbank.tabelle noch einen Alias sehen.
Verwendest Du beim Tabellenbezeichner nen Punkt, kollidiert das damit:
Multiple-table syntax:
Code:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]
Damit kann man Referenzen killen.
Zu beachten ist auch das:
Zitat:
where_condition is an expression that evaluates to true for each row to be deleted. It is specified as described in Section 13.2.8, “SELECT Syntax”.
Currently, you cannot delete from a table and select from the same table in a subquery.
|
DELETE erwartet immer nur den Tabellenbezeichner.
http://dev.mysql.com/doc/refman/5.1/en/delete.html
Sollte sich die Tabelle nicht in der aktuellen sondern einer anderen Datenbank befinden, mußt Du die Datenbank wechseln:
http://dev.mysql.com/doc/refman/5.1/de/use.html
|
30.03.2013, 19:01:05
|
Anfänger
|
|
Registriert seit: Mar 2013
Alter: 53
Beiträge: 6
|
|
AW: Delete Problem
Vielen Dank! Und wieder was gelernt.
Marc
|
01.04.2013, 00:35:06
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 76
Beiträge: 4.001
|
|
AW: Delete Problem
Zitat:
Zitat von undnbsp
Vielen Dank! Und wieder was gelernt.
|
a. fein
b. nur für die Nachwelt incl. Suchmaschinen: wie sieht die aktuelle Abfrage aus?
|
01.04.2013, 09:58:07
|
Anfänger
|
|
Registriert seit: Mar 2013
Alter: 53
Beiträge: 6
|
|
AW: Delete Problem
Also ich habe mich (warum weiss ich nicht mehr) für diese Variante entschieden:
echo des SQL:
DELETE FROM test.`prod`
WHERE (`PROD_SA` = 2013 AND `PROD_PA` = 6315) or
(`PROD_SA` = 2013 AND `PROD_PA` = 6314) or
(`PROD_SA` = 2013 AND `PROD_PA` = 6313)
Ich lasse beim Auslesen der Tabelle Bzw. Füllen des Arrays auch gleichzeitig die WHERE-Syntax zusammenbauen und so sieht dann der SQL-Code aus:
DELETE
FROM test.prod
WHERE $delete_where
Bin mittlerweile auch darauf gekommen, warum meine Variante 2 nicht geklappt hat. multi_query geht nur bei mysqli. RTFM läßt grüßen.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 04:51:58 Uhr.
|