Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

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

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von placebo, 19 Oktober 2013.

  1. placebo

    placebo Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

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


    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
     
  3. placebo

    placebo Neuer Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. placebo

    placebo Neuer Benutzer

    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:
    Ich komme einfach nicht drauf, wie ich die Werte der Differenzmenge einzeln ansprechen kann.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden