PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Delete Problem (http://www.selfphp.de/forum/showthread.php?t=24915)

undnbsp 29.03.2013 12:28:23

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

DokuLeseHemmung 29.03.2013 13:56:22

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.

Socrates 29.03.2013 18:04:26

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

undnbsp 30.03.2013 05:42:17

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

meikel (†) 30.03.2013 15:12:38

AW: Delete Problem
 
Zitat:

Zitat von undnbsp (Beitrag 144741)
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

undnbsp 30.03.2013 18:01:05

AW: Delete Problem
 
Vielen Dank! Und wieder was gelernt.

Marc

meikel (†) 31.03.2013 23:35:06

AW: Delete Problem
 
Zitat:

Zitat von undnbsp (Beitrag 144757)
Vielen Dank! Und wieder was gelernt.

a. fein
b. nur für die Nachwelt incl. Suchmaschinen: wie sieht die aktuelle Abfrage aus?

undnbsp 01.04.2013 08:58:07

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:40:54 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.