Ankündigung

Einklappen
Keine Ankündigung bisher.

MYSQL INSERT INTO variable geht nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MYSQL INSERT INTO variable geht nicht

    hallo ... ich komm mal wieder nciht weiter und brauche eure hilfe ...

    bitte nicht weiter über den sinn des folgenden beispiels nachdenken ... da gibts keinen :P
    das beispiel sollte aber mein problem recht deutlich darstellen.

    also ich fang am besten mal vorne an:
    wetterstationen ... diese wetterstationen sollen so heißen wie die stadt in der sie stehen ... nun soll jede wetterstation die temperatur messen und speichern (es soll also um auch jahreshöchsttemperatur, durchschnittstemperatur etc. ermitteln zu können eine art history erstellt werden) ... dies kann nun einmal intuitiv und einmal clever gemacht werden:
    intuitiv: messe in zeitintervall x und schreibe die aktuelle temperatur in eine tabelle
    clever: schreibe bei jeder temperaturänderung den neuen wert in eine tabelle

    ... beide mal steht die aktuelle temperatur in der tabelle ganz unten ...

    nun möchte ich in einer weiteren tabelle den wetterstationen ID's zuordnen ...

    das konzept schaut nun so aus:
    tabelle <wetterstationen>
    Code:
    ID | name | temp
    =============
     1 | berlin | 12.5
     2 | köln   | 16.6
     3 | bon   | 18.0
    tabelle <station_1> also station_id mit eben der id aus der tabelle wetterstationen (t soll ein timestamp sein um also eine temperatur einem datum zu zu ordnen)
    Code:
     t | temp
    =======
     1 | 10.5
     5 | 11.6
     9 | 12.5
    tabelle <station_2>
    Code:
     t | temp
    =======
     5 | 14.5
     7 | 15.6
     9 | 16.6
    tabelle <station_3>
    Code:
     t | temp
    =======
     3 | 16.5
     6 | 17.6
     7 | 18.0
    nun der ansatz wie ich es bisher gemacht habe: ich habe einfach immer MYSQL kommandos über php gesendet ... zuerst habe ich die id zum namen in der <wetterstation> tabelle gesucht und dann die temperatur in der tabelle <wetterstation> geändert und an die tabelle <station_id> angefügt ... ($bezeichner sind variablen die aus php stammen ... also nicht wundern ... soll der sting sein, wenn ich in mysql_query eintrage)

    also id bestimmen
    Code:
    SELECT id FROM wetterstationen WHERE name=$stations_name LIMIT 1;
    in <wetterstation> eintragen
    Code:
    UPDATE wetterstation  SET temp=$temp WHERE id=$id;
    und in <station_id> eintragen
    Code:
    INSERT INTO station_$id (t, temp) VALUES($t, $temp);

    soweit sogut ... nun das eigentliche problem:
    ich habe versucht mir eine eigene MYSQL Funktion zu bauen, die das ganze für mich in einen schritt erledigt ... das ist also mein bisheriger ansatz, der leider nicht funktioniert ...

    Code:
    DELIMITER $$
    CREATE PROCEDURE Add(station_name char[50], time_now int, temp_now float)
    BEGIN
      SET @id = (SELECT id FROM wetterstationen WHERE name=station_name LIMIT 1);
    
      UPDATE wetterstation  SET temp=temp_now WHERE id=@id;
    
      SET @station_id = CONCAT_WS('_', 'station', @id);
    
      INSERT INTO @station_id (t, temp) VALUES(time_now, temp_now);
    END $$
    DELIMITER ;
    also über hilfe würde ich mir sehr freuen ... zumal ich schon ewigkeiten vor diesem problem sitze und mich immer im kreis drehe ...

    ach und: wer sich jetzt fragt, warum ich so viel text schreibe um so ein kleines problem zu beschreiben ... nunja ... zum einen, weil ich so hoffe, besser verstanden zu werden und zum anderen, weil es ja sein könnte, dass ich die tabellen total sinnfrei organisiert habe und mein gesamtkonzept garnicht stimmig ist ...

    schonmal vielen dank
    LG


  • #2
    Was heißt "funktioniert nicht"? Was passiert (oder: passiert nicht)?

    Wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Zitat von devil13 Beitrag anzeigen
      in <wetterstation> eintragen
      Code:
      UPDATE wetterstation  SET temp=$temp WHERE id=$id;
      Wenn du schon hier Fehler machst - dann steht zu erwarten, dass du beim restlichen Code auch irgendwo geschludert hast.


      Und wenn sich die Problembeschreibung dann noch im wesentlichen auf „funzt nich“ reduziert ... wie soll man dir denn da weiterhelfen können?

      Kommentar


      • #4
        Zitat von ChrisB Beitrag anzeigen
        Wenn du schon hier Fehler machst - dann steht zu erwarten, dass du beim restlichen Code auch irgendwo geschludert hast.


        Und wenn sich die Problembeschreibung dann noch im wesentlichen auf „funzt nich“ reduziert ... wie soll man dir denn da weiterhelfen können?
        du meinst dass es
        Code:
        UPDATE wetterstationEN  SET temp=$temp WHERE id=$id;
        heißen müsste? ja da haste recht ... aber ich habe das nicht ausprobiert, sondern nur so hingeschrieben ... denn mit der "php-variante" geht es ja (nicht falsch verstehen ... meine die variante mysql kommando senden und in php auswerten und neues kommando senden ... will es ja alles direkt in MYSQL machen lassen) ... habe den aktuellen quellcode mal angefügt ...

        Zitat von wolf29 Beitrag anzeigen
        Was heißt "funktioniert nicht"? Was passiert (oder: passiert nicht)?
        also ich poste mal den code, der mein beispiel entspricht ... is nicht sonderlich schön ... aber naja ...

        was passiert (wenn ich den auskommentierten bereich auskommentiert lasse): es wird nur eine tabelle erstellt und zwar:
        tabelle <wetterstationen>
        Code:
        id | name   | temp
        ===================
         1 | berlin | 12.5
         2 | köln   | 16.6
         3 | bonn   | 18.0

        was passiert, wenn ich den kommentierten bereich einkommentiere (was ja mein wunsch ist):
        SQL Error (1064): ich habe einen error bei '@station_id (t int Not NULL UNIQUE, ........ es werden keine tabellen wie station_1 usw. erstellt ...



        Code:
        CREATE TABLE IF NOT EXISTS wetterstationen (id int NOT NULL AUTO_INCREMENT UNIQUE, name char(50) UNIQUE, temp float);
        
        DELIMITER $$
        CREATE PROCEDURE AddTemp(station_name char(50), time_now int, temp_now float)
        BEGIN
          INSERT IGNORE INTO wetterstationen (name) VALUES (station_name) ON DUPLICATE KEY UPDATE id=id;
          
          SET @s_id = (SELECT id FROM wetterstationen WHERE name=station_name LIMIT 1);  
          UPDATE wetterstationen SET temp=temp_now WHERE id=@s_id;
          
          SET @station_id = CONCAT_WS('_', 'station', @s_id);
          SELECT @station_id;
          
          
          #CREATE TABLE IF NOT EXISTS @station_id (t int NOT NULL UNIQUE, temp int);
          #INSERT INTO @station_id (t, temp) VALUES(time_now, temp_now);
        END $$
        DELIMITER ;
        
        
        CALL AddTemp('berlin', 1, 10.5);
        CALL AddTemp('berlin', 5, 11.6);
        CALL AddTemp('berlin', 9, 12.5);
        
        CALL AddTemp('köln', 5, 14.5);
        CALL AddTemp('köln', 7, 15.6);
        CALL AddTemp('köln', 9, 16.6);
        
        CALL AddTemp('bonn', 3, 16.5);
        CALL AddTemp('bonn', 5, 17.6);
        CALL AddTemp('bonn', 7, 18.0);

        Kommentar


        • #5
          MySQL Lists: mysql-de: CREATE Anweisung in Stored procedure

          Kommentar


          • #6
            Das ist vom Grundsatz her schon falsch. Keine Tabelle je Station! Nein, nein, nein. Sowas macht man nicht.

            Und auch wenn es nur ein Beispiel ist: Clever ist deine clevere Methode nur, wenn du keine Datensätze schreibst solange ein bestimmtes Intervall nicht erreicht wurde. Sonst läuft dir die DB voll, wenn ein Sensor "flattert"

            Kommentar


            • #7
              Zitat von mquadrat Beitrag anzeigen
              Das ist vom Grundsatz her schon falsch. Keine Tabelle je Station! Nein, nein, nein. Sowas macht man nicht.
              ja sagen das etwas doof is ist leicht ... kannst du mir auch begründen warum das so doof ist oder zumindest sagen, wie ich das besser machen könnte? an einer alternativen besseren lösung bin ich brennend interessiert ... mir fiel leider nur nichts gescheiteres ein ...

              LG

              Kommentar


              • #8
                ...löst mein problem scheinbar ganz gut ... bekomm ich aber nicht zum laufen ... bisher hatte ich nur die wie ich finde mogellösung mit prepare ... danke dafür

                LG

                Kommentar


                • #9
                  Zitat von devil13 Beitrag anzeigen
                  ja sagen das etwas doof is ist leicht ... kannst du mir auch begründen warum das so doof ist oder zumindest sagen, wie ich das besser machen könnte? an einer alternativen besseren lösung bin ich brennend interessiert ... mir fiel leider nur nichts gescheiteres ein ...

                  LG
                  Naja da gibts ne ganz einfache Begründung: du brauchst für jede neue Station eine neue Tabelle und das ist nunmal einfach mist.

                  Deine Werte lassen sich doch ganz einfach in zwei Tabellen abspeichern:

                  Code:
                  id | name   
                  ===================
                   1 | berlin
                   2 | köln
                   3 | bonn
                  Code:
                  id | id_station| t | temp
                  ===================
                   1 | 1 | 5 | 12.5
                   2 | 1 | 7 | 16.6
                   3 | 1 | 9 | 18.0

                  Kommentar


                  • #10
                    Zitat von devil13 Beitrag anzeigen
                    ja sagen das etwas doof is ist leicht ... kannst du mir auch begründen warum das so doof ist
                    Die Faustregel lautet ganz einfach, Daten gleicher Struktur gehören auch in ein und die selbe Tabelle.

                    Wer davon abweichen will, sollte einen sehr, sehr, seeehr guten Grund dafür benennen können.
                    Und nur „mir fällt nichts besseres ein“ ist ganz bestimmt kein solcher.
                    Das ist im Gegenteil ein Zeichen dafür, dass du dich mehr mit den Grundlagen auseinandersetzen musst.

                    Kommentar


                    • #11
                      Zitat von ChrisB Beitrag anzeigen
                      Die Faustregel lautet ganz einfach, Daten gleicher Struktur gehören auch in ein und die selbe Tabelle.

                      Wer davon abweichen will, sollte einen sehr, sehr, seeehr guten Grund dafür benennen können.
                      Und nur „mir fällt nichts besseres ein“ ist ganz bestimmt kein solcher.
                      Das ist im Gegenteil ein Zeichen dafür, dass du dich mehr mit den Grundlagen auseinandersetzen musst.
                      also darf ich mal bemerken, dass „mir fällt nichts besseres ein“ ungleich ich habe mir keinen kopf gemacht ist?!?

                      denn ich habe auch genau diesen vorgeschlagenen fall bedacht und verworfen ... warum? ja aus folgendem grund: angenommen es gibt 10.000 wetterstationen ... und alle 9.999 wetterstationen messen das ganze jahr schlicht weg das gleiche ... es gibt also keine temperaturänderung ... nun aber die eine kleine wetterstation misst jede sekunde einen anderen wert ... und jetzt werden eurem vorschlag nach jede sekunde daten in die tabelle geschrieben ... und eben 9.999 mal, dass sich nichts geändert hat ...

                      ... ja ich weiß ... äußert unwarscheinlich ... aber ich finde es eben totale speicherverschwendung ... zumal die wahrscheinlichkeit, dass sich in einem zeitintervall nur ein wert der 10.000 stationen ändert nicht mehr so unwahrscheinlich ist ... also ich habe mir schon einen kopf gemacht ... auch wenn das nicht den anschein hat ... ich bin dennoch über alternative (bessere) lösungen dankbar, da ich mich mit datenbankprogrammierung nicht sonderbar auskenne ...

                      LG

                      Kommentar


                      • #12
                        Zitat von devil13 Beitrag anzeigen
                        also darf ich mal bemerken, dass „mir fällt nichts besseres ein“ ungleich ich habe mir keinen kopf gemacht ist?!?
                        Darfst du, wollte ich damit auch nicht andeuten.

                        Bleibt aber dabei, dass es das Datendesign nicht rechtfertigt.

                        Warum, hat dir cycap übrigens schon aufgezeigt!

                        und alle 9.999 wetterstationen messen das ganze jahr schlicht weg das gleiche ... es gibt also keine temperaturänderung ... nun aber die eine kleine wetterstation misst jede sekunde einen anderen wert ... und jetzt werden eurem vorschlag nach jede sekunde daten in die tabelle geschrieben ... und eben 9.999 mal, dass sich nichts geändert hat ...
                        Ich sehe nicht, wie das irgendeinen Bezug dazu haben soll, dass Daten gleicher Struktur in die gleiche Tabelle gehören?

                        Wenn sich 9.999 mal nichts ändert, dann musst du dich halt entscheiden, ob du regelmäßig in einem Intervall Werte speichern willst - oder ob du sagst, ich speichere nur veränderte Werte, und der zuletzt gespeicherte ist der als der aktuell gültige zu betrachten.

                        Das hat mit der Frage, ob die Daten alle in einer Tabelle stehen, oder in mehreren, doch nicht das geringste zu tun.


                        ich bin dennoch über alternative (bessere) lösungen dankbar, da ich mich mit datenbankprogrammierung nicht sonderbar auskenne ...
                        Die Faustregel kennst du jetzt schon, und in deinem Einwand kann ich absolut nichts erkennen, was die außer Kraft setzen sollte.

                        Wenn du dich über Normalisierung noch nicht informiert hast, solltest du das als nächstes tun - das ist eines der Haupt-Stichworte beim Modellieren von Datenbank-Tabellen.

                        Kommentar


                        • #13
                          Zitat von ChrisB Beitrag anzeigen
                          ... oder ob du sagst, ich speichere nur veränderte Werte, und der zuletzt gespeicherte ist der als der aktuell gültige zu betrachten.
                          tut mir leid, wenn mein einwand unbegründet sein mag, oder wenn ich dich oder cycap falsch verstanden habe ... aber genau das möchte ich doch auch ... nur bekomme ich das nicht so hin, dass folgende forderungen erfüllt sind:
                          1) der äktuelle wert ist der letzte
                          2) es werden nur änderungen abgespeichert
                          3) folgt eigentlich aus 2) ... wenn sich ein wert ändert sollen nicht alle anderen (also auch die die sich nicht geändert haben) mit in die tabelle aufgenommen werden ...
                          4) folgt indirekt auch aus 2) ... es soll keine leeren einträge in der tabelle geben ...

                          ich lass mich aber gerne belehren

                          ein wenig habe ich mich bereits mit normalisierungen beschäftigt ... aber ich finde nicht, dass mir das bei meinem problem weiter hilft ...

                          LG

                          Kommentar


                          • #14
                            Trotzdem hat das nichts mit der DB-Struktur zu tun. Denn
                            und jetzt werden eurem vorschlag nach jede sekunde daten in die tabelle geschrieben ... und eben 9.999 mal, dass sich nichts geändert hat ...

                            ... ja ich weiß ... äußert unwarscheinlich ... aber ich finde es eben totale speicherverschwendung ...
                            gilt ja gleichermaßen, wenn Du separate Tabellen benutzt. Es sei denn, Du setzt es eben anders um. Und auch dann gibt es nichts, was gegen Normalisierung spricht. Aber einiges, was dafür spricht.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              1) bis 4) sind alles Punkte, die du in deiner Logik beim Auslesen/Eintragen der Daten implementieren musst.

                              Mit dem Datenmodell haben die herzlich wenig zu tun.

                              Oder ...
                              3) folgt eigentlich aus 2) ... wenn sich ein wert ändert sollen nicht alle anderen (also auch die die sich nicht geändert haben) mit in die tabelle aufgenommen werden ...
                              ... soll das etwa bedeuten, dass du die Werte aller Wetterstationen in zig einzelnen Spalten eines Datensatzes ablegst?

                              Wenn ja, wäre das der bisher größte Fehler, den du gemacht hast - dann wird es umso mehr Zeit, dass du dich mit dem Thema Normalisierung beschäftigst!

                              Kommentar

                              Lädt...
                              X