Zwei Einträge gleichzeitig ändern

OlliK75

Benutzer
Beiträge
6
Hallo Leute,

kann man 2 Einträge gleichzeitig bearbeiten?

aktuell ist es so:
$sql = „UPDATE umenue_navi SET ID = ‚$_Param1‘ WHERE UMenueID = ‘$_Param2‘“

ist es überhaupt technisch möglich noch zusätzlich nach WHERE einen zweiten UMenueID hinzuzufügen?

$sql = „UPDATE umenue_navi SET ID = ‘$_Param1‘, ID = ‚$_Param3‘ WHERE UMenueID = ‘$_Param2‘, UMenueID = ‚$_Param4‘“

oder gibt es eine andere Möglichkeit zwei Tabellenzeilen (also zwei UMenueID) gleichzeitig ändern?

VG Olli.
 
Werbung:

Kampfgummibaerlie

Datenbank-Guru
Beiträge
622
Mein erster Einfall wäre ein Foreign-Key mit cascade on update, ich denke aber, dass es am Verständnisproblem liegt, was du erreichen möchtest.
Mein zweiter Einfall wäre eine einfache "or"-Regel in die Abfrage einzubauen, sprich:
Code:
update umenue_navi set id = 1 where umenueid = 2 or umenueid = 3;

eventuell meinst du das verändern einfach nur so:
Code:
update twocols set id1 = 2, id2 = 2;
einfach die spalten, die du ändern willst, mit der Veränderung hintereinander mit einem Beistirch getrennt aufschreiben. Siehe Beispiel

EDIT:
die where klausel einfach nach den beiden sets dazuschreiben, falls gewollt.
 
Zuletzt bearbeitet:

dabadepdu

Datenbank-Guru
Beiträge
1.179
UPDATE umenue_navi SET ID = ‘$_Param1‘, ID = ‚$_Param3‘ WHERE UMenueID = ‘$_Param2‘, UMenueID = ‚$_Param4
Du kannst syntaktisch in einer Where Clause mehrere Werte angeben. Allerdings nicht wie Du es gemacht hast.
Es geht z.B. so: where UMenueID in (<p1>,<p2>)
Alternativ mit OR

Was Du in der Set Clause gemacht hast, geht nicht. Syntaktisch kannst Du natürlich mehrere Spalten mit Komma getrennt aufführen, aber die müssen dann auch eindeutig und existent sein.

Dein Statement würde funktionieren, wenn Du im Set erneut eine Prüfung auf die ID aus der Where Clause machst. Bspw. mit einem Case Statement.
Ansonsten wäre schon die Frage wie von akretschmer, warum willst Du das?

Angenommen, Du willst sicherstellen, dass es keinen Moment gibt, wo in dem Menu eine falsche Kombination abgerufen werden kann, dann würdest Du eine klammernde Transaktion um 2 separate Updates machen. 2 Statements, die wie eins funktionieren.
Eine weitere Möglichkeit sind correlated Updates. Dort arbeitest Du mit einem einzigen Updatestatemet und änderst beliebig viele Datensätze mit individuellen Werten. Der "Haken" ist dabei, dass alle "Parameter" sowohl für Where Clause als auch für Set Clause aus bereits vorhandenen Daten kommen müssen. Aber auch das könnte man in Deinem Fall realisieren, indem man eine "künstliche" Tabelle im Statement verwendet, die Deine Werte hält. Diese letzte Variante wäre allerdings schon etwas schräg bzw. ungewöhnlich.
 

OlliK75

Benutzer
Beiträge
6
IMG_2213.JPG


nur als Beispiel:
UMenueID 1 und 2 muss nur die ID getauscht werden.

Ich habe eine Funktion wo man jede Zeile Einzeln speichern kann. 1. Problem: ich habe nur folgende Spalten-Werte zur Verfügung - HThemaID und ID. 2. Problem: Ändere ich die erste Tabellen-Zeile den ID Wert, findet er beim nächsten speichern den anderen ID Wert nicht mehr, logisch. Deswegen such ich eine Lösung, 2 Einträge gleichzeitig zu ändern. Leider habe ich die Variable UMenueID zu diesem Zeitpunkt nicht zur Verfügung. Obwohl wenn ich vorm ändern die Variable UMenueID ermittle (über HThemaID und ID), müsste dann das speichern funktionieren - fällt mir grad ein.

VG Olli.
 

akretschmer

Datenbank-Guru
Beiträge
9.933
Hat Deine Tabelle einen PK?

Code:
postgres=# create table ollik75(id int primary key, umenuid int);
CREATE TABLE
postgres=# copy ollik75 from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1    24
>> 2    42
>> 3    66
>> \.
COPY 3
postgres=# select * from ollik75 ;
 id | umenuid 
----+---------
  1 |      24
  2 |      42
  3 |      66
(3 rows)

postgres=# begin;
BEGIN
postgres=*# update ollik75 set umenuid=42 where id = 1;
UPDATE 1
postgres=*# update ollik75 set umenuid=24 where id = 2;
UPDATE 1
postgres=*# select * from ollik75 ;
 id | umenuid 
----+---------
  3 |      66
  1 |      42
  2 |      24
(3 rows)

postgres=*# commit;
COMMIT
postgres=#
 
Werbung:
Oben