mySQL: nur ein Feld (PK) jeweils eines Datensatzes aktualisieren

placebo

Neuer Benutzer
Beiträge
3
Hallo Leute,

ich hoffe, dass ihr mir helfen könnt.

Ich habe eine Tabelle namens 'istveranstvon' und sie enthält folgende Felder: 'veranstaltung', 'unitimenr', 'curricula', 'wpf'; PK sind 'veranstaltung' und 'curricula'

Eine zweite Tabelle heißt 'veranstaltung' und besitzt folgende Felder: 'veranstnr', 'veranstname' und andere unwichtige Informationsfelder; PK ist veranstnr.

Ich möchte jetzt, dass alle einmal vorkommenden Werte in der Spalte 'veranstaltung' der Tabelle 'istveranstvon' in die Spalte der Tabelle 'veranstaltung' übernommen werden. Bereits vorkommende Werte sollen ignoriert werden.

Ich bin das Problem anhand eines Cursors angegangen:

Code:
DELIMITER $$

CREATE PROCEDURE cursor_example12()
BEGIN

DECLARE var_col1, var_done INT DEFAULT 0;
DECLARE myCursor CURSOR FOR SELECT pufferTabelle.veranstaltung FROM
                          (SELECT veranstaltung FROM fbiplan.istveranstvon GROUP BY veranstaltung HAVING (COUNT(veranstaltung)>=1)) pufferTabelle;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_done = 1;

-- SET var_done = 0; #only required if there is a SELECT ... INTO ... before opening the cursor, which could return no results

OPEN myCursor;
FETCH NEXT FROM myCursor INTO var_col1;

WHILE NOT var_done DO

update fbiplan.veranstaltung set veranstNr=var_col1; #or whatever the loop is supposed to do

-- SET var_done = 0; #only required if there is a SELECT ... INTO ... in the loop, which could return no results
FETCH myCursor INTO var_col1;

END WHILE;
CLOSE myCursor;

END$$

Nun habe ich das Problem, dass ich folgende Fehlermeldung bekomme
Error Code: 1062. Duplicate entry '41011' for key 'PRIMARY'

Weiter weiss ich nicht. Habt ihr eine Ahnung, wie ich das Problem lösen kann?

Geht es vielleicht sogar mit einer einfachen select-Anweisung?

Freundlicher Gruß

placebo
 
Werbung:
Ich möchte jetzt, dass alle einmal vorkommenden Werte in der Spalte 'veranstaltung' der Tabelle 'istveranstvon' in die Spalte der Tabelle 'veranstaltung' übernommen werden. Bereits vorkommende Werte sollen ignoriert werden.

Ich bin das Problem anhand eines Cursors angegangen:

Es gibt zu jeder einfachen Lösung immer unendlich viele Lösungen, die komplizierter sind.

Nun habe ich das Problem, dass ich folgende Fehlermeldung bekomme
Error Code: 1062. Duplicate entry '41011' for key 'PRIMARY'

Weiter weiss ich nicht. Habt ihr eine Ahnung, wie ich das Problem lösen kann?

Geht es vielleicht sogar mit einer einfachen select-Anweisung?

Freundlicher Gruß

placebo


Du hast:
Code:
test=*# select * from placebo_1;
a | b
---+---
1 | 1
1 | 2
2 | 2
2 | 1
3 | 1
3 | 2
3 | 3
(7 rows)

Time: 0,167 ms
test=*# select * from placebo_2;
a
---
2
(1 row)


Du willst diese in placebo_2 einfügen:
Code:
test=*# select a from placebo_1 except select a from placebo_2;
a
---
1
3
(2 rows)


Also ran ans Werk:
Code:
test=*# with es_fehlen as (select a from placebo_1 except select a from placebo_2) insert into placebo_2 select a from es_fehlen;
INSERT 0 2

Vertrauen ist gut, Kontrolle aber besser:
Code:
test=*# select * from placebo_2;
a
---
2
1
3
(3 rows)

Syntax ist PostgreSQL, möglicherweise wird das so 1:1 nicht in MySQL gehen. Aber Du willst ja was lernen, also wirst Du das, wa ich da tat, versuchen zu verstehen und an die limitierten Möglicheiten an MySQL anpassen. Viel Erfolg!

Andreas
 
Hallo Andreas,

danke für Deinen Tipp mit der Differenzmenge.
Ich habe einfach meinen Cursor im Hinblick auf Deine Hinweise deklariert und eine neue Insert-Anweisung geschrieben.
Und es hat super geklappt!

placebo
 
Hallo Andreas,

danke für Deinen Tipp mit der Differenzmenge.
Ich habe einfach meinen Cursor im Hinblick auf Deine Hinweise deklariert und eine neue Insert-Anweisung geschrieben.
Und es hat super geklappt!

placebo

Nun ja. Dennoch halte ich es für unnötig, da eine Schleife zu machen. Sowas skaliert nicht. Du machst unnötig viele Inserts, da ist (bei transaktionsbasierten DB-Systemen) unnötig viel Aufwand dahinter. Und selbst bei MyISAM: Locks.
 
Werbung:
Das wäre der Code ohne einen Cursor:
Code:
insert into fbiplan.veranstaltung2 values (

(select t1.veranstaltung
from
(SELECT veranstaltung
FROM fbiplan.istveranstvon
GROUP BY veranstaltung
HAVING (COUNT(veranstaltung)>=1)) t1
where
t1.veranstaltung not in    (select t2.veranstNr from (select veranstNr from fbiplan.veranstaltung2) t2)    ), '', null, null, null, null, null, null)

Da erhalte ich folgende Fehlermeldung:
Error Code: 1242. Subquery returns more than 1 row 0.015 sec

Ich komme einfach nicht drauf, wie ich die Werte der Differenzmenge einzeln ansprechen kann.
 
Zurück
Oben