Announcement

Collapse
No announcement yet.

Insert mit Datumsbereich

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Insert mit Datumsbereich

    Hallo !

    Momentan beschäftige ich mich mit einer SQL Query in MySQL.
    Ich habe eine MyISAM Tabelle mit den Spalten 'city', 'street',
    'housenumber' und 'factor'.
    Zudem gibt es eine Spalte 'datum' im Format 'date'.

    Nun möchte ich für einen Datumsbereich
    den Faktor in Abhängigkeit von 'city', 'street' und 'housenumber'
    verändern.

    Folgende Query ist garantiert falsch, soll aber das Problem aufzeigen.
    -----------

    INSERT INTO hhs SET
    factor = '0.75'
    WHERE
    city = 'myCityY',
    street = 'myStreetY',
    housenumber = '66'
    BETWEEN
    datum > 2012-05-01
    AND
    datum < 2012-05-20

    -----------

    Kann man das Problem mit einer 'normalen' Query lösen oder
    geht es nicht ohne 'procedure'.

    Ich würde mich über eine Info freuen.


    Mit freundlichen Grüßen

    Stephan

  • #2
    Hallo,

    du schreibst, dass du einen Wert ÄNDERN möchtest - warum versuchst du es dann mit INSERT? Für das Ändern von Datensätzen gibt es den UPDATE-Befehl!

    [highlight=sql]
    UPDATE hhs SET
    factor = 0.75
    WHERE city = 'myCityY'
    AND street = 'myStreetY'
    and housenumber = '66'
    and datum BETWEEN '2012-05-01' AND '2012-05-20'
    [/highlight]

    Anmerkung: BETWEEN schliesst die Grenzem mit ein. Wenn du die Grenzen ausschliessen möchtest, dann musst du sie entweder anpassen oder stattdessen ein < > verwenden.
    [highlight=sql]
    ...
    and datum > '2012-05-01'
    AND datum < '2012-05-20'
    [/highlight]

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Insert und Schleife

      Hallo !

      Danke für die Information.

      Nun möchte ich folgende Veränderung vornehmen.
      Ich möchte eine größere Anzahl von Datensätzen einfügen,
      die in den Spalten konstant sind und sich nur im Datum unterscheiden.

      Folgende Query ist falsch und soll nur die Idee darstellen.

      Code:
      INSERT
        hhs 
      SET
        faktor = 0.75,
        city = 'myCity',
        street = 'myStreet',
        housenumber = '5' 
      WHERE  
        datum BETWEEN '2012-04-01' 
        AND '2012-04-30'
      Im Zeitraum vom 01.04.2012 bis zum 30.04.2012
      sollen konstante Datensätze eingegeben werden.
      Das ganze ist irgendwie eine Schleife.

      Kann man das mit einer Query realisieren ?

      Mit freundlichen Grüßen

      Stephan

      Comment


      • #4
        Hallo,

        irgendwie vermischst du immer noch INSERT- und UPDATE-Syntax. Hier hilft ein Blick in die Doku!
        Und Nein, in SQL gibt es keine Schleifen!

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Replace für Insert und Update

          Hallo !

          Danke für die Info. ich habe mich inspirieren lassen durch das Kommando
          'replace' und hatte versucht ein kombiniertes Insert und Update zu realisieren.
          Du hast Recht, Insert und somit Replace kennen keine 'where' Klausel.

          Zum zweiten Problem. Es gibt Schleifen in MySQL.
          In den Prozeduren die in MySQL angelegt werden können,
          kann eine Schleife verwandt werden.

          Bsp.:

          1. Prozedure anlegen:

          Code:
          DELIMITER $$
          
          CREATE
              PROCEDURE `test`.`zahlschleife_loop`()
              BEGIN
                DECLARE v_zaehler INT;
                SET v_zaehler = 0;
                loop_zahlen: LOOP
                  SET v_zaehler = v_zaehler + 1;
                  SELECT v_zaehler;
              
                  IF v_zaehler = 100
                    THEN LEAVE loop_zahlen;
                  END IF;
                END LOOP loop_zahlen;
          
          END$$
          2. Prozedure aufrufen:

          Code:
          CALL zahlschleife_loop();
          Leider bin ich im Bereich Prozeduren noch ein absoluter Anfänger.

          Mit freundlichen Grüßen

          Stephan

          Comment


          • #6
            Originally posted by Stephan123 View Post
            ...Zum zweiten Problem. Es gibt Schleifen in MySQL.
            Ich hab ja auch nicht gesagt, dass es gar nicht geht. Du hast gefragt:
            Kann man das mit einer Query realisieren ?
            Und da heisst es ganz klar: Nein, mit SQL lassen sich keine Schleifen programmieren!

            Was du ansprichst sind Compound Statements in MySQL. Wie viele andere DBMS kennt MySQL eine Sprache, um gespeicherten Routinen anzulegen. Diese unterscheiden sich jedoch je nach DBMS (T-SQL, PL/SQL, Compound Statement, ...). Mit gespeicherte Routinen lassen sich natürlich auch Schleifen programmieren, aber das war nicht die Frage...

            Gruß Falk

            P.S.: Ich weiß jetzt nicht, ob dein "Leider bin ich im Bereich Prozeduren noch ein absoluter Anfänger." jetzt eine abschließende Feststellung oder doch eher ein Ruf nach Hilfe ist. Falls Letzteres zutrifft, solltest du konkretisieren WO genau du Probleme hast.
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Schleifen in einer Procedure

              Hallo !

              Danke für die Antwort. Du hast Recht es ist die Anfrage eines Anfängers.
              Ich habe eine Tabelle.

              __________________________________________________
              | id | city | street | housenumber | factor | date |
              --------------------------------------------------------------------------------
              | 1 | cityA | streetA | 5 | 0.7 | 2012-05-01 |
              ---------------------------------------------------------------------------------
              | 2 | cityA | streetA | 5 | 0.95 | 2012-05-02 |
              ---------------------------------------------------------------------------------
              | 3 | cityB | streetY | 66 | 0.65 | 2012-05-02 |
              ---------------------------------------------------------------------------------
              | 4 | cityA | streetA | 5 | 0.39 | 2012-05-03 |
              ---------------------------------------------------------------------------------

              Der 'primay key' ist in der Spalte 'id'.
              Ein zusätzlicher key erstreckt sich über die Spalten 'city', 'street' und
              'housenumber'.

              Ich bekomme Werte die folgendes enthalten.

              city = 'cityA'
              street = 'streetA'
              housenumber = '5'

              Der veränderliche Wert ist factor = 0.33

              Dazu kommt ein Datumsbereich von: '2012-05-11' bis: '2012-05-28'

              Ich suche nach einer Möglichkeit (Procedure oder anderes)
              um diese Daten in die MySQL einzutragen.

              Wenn ein Datensatz bereits vorhanden ist, entsprechend
              'city', 'street' und 'housenumber' dann soll der Datensatz
              geupdatet werden. Ist der Datensatz nicht vorhanden, dann soll
              er neu angelegt werden.

              Zur Lösung dieses Problems bin ich für jede Information dankbar.


              Mit freundlichen Grüßen

              Stephan

              Comment


              • #8
                Hallo,

                ich habe Probleme mit deiner Terminologie und damit zu verstehen was du im Endeffekt willst.

                Originally posted by Stephan123 View Post
                Der 'primay key' ist in der Spalte 'id'.
                Ein zusätzlicher key erstreckt sich über die Spalten 'city', 'street' und 'housenumber'.
                Also ein "Key" ist bei mir ein Schlüssel und damit eindeutig. Anhand deiner Daten kann ich aber keine Eindeutigkeit in 'city', 'street' und 'housenumber' erkennen! Liegt also jetzt auf 'city', 'street' und 'housenumber' tatsächlich ein Key - dann stimmen deine Daten nicht - oder nur ein einfacher Index?

                Daraus ergeben sich auch Konsequenzen für deine weiteren Fragen.

                Originally posted by Stephan123 View Post
                ...Dazu kommt ein Datumsbereich von: '2012-05-11' bis: '2012-05-28'
                Heisst das jetzt, dass du für eine Kombination von 'city', 'street' und 'housenumber' für einen 'factor' mehrere Datensätze anlegen willst und zwar für jedes Datum in diesem Zeitraum einen? Wenn ja, dann darf 'city', 'street' und 'housenumber' KEIN Key sein. Wenn Nein, dann weiss ich nicht wie du in deinem Datenmodell den Zeitraum unterbringen willst.

                Originally posted by Stephan123 View Post
                ...Wenn ein Datensatz bereits vorhanden ist, entsprechend 'city', 'street' und 'housenumber' dann soll der Datensatz
                geupdatet werden.
                Hmmm... Hier haben wir wieder das Problem mit dem Schlüssel. Welcher DS in deinen Beispieldaten sollte denn geändert werden? Es gibt insgesamt 3 für city = 'cityA', street = 'streetA' und housenumber = '5'

                Bevor du also an die konkrete Umsetzung einer "Möglichkeit (Procedure oder anderes)" gehst, solltest du dir absolut klar machen, WAS genau WANN mit WELCHEN Daten passieren soll.

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Alle Datensätze anlegen / updaten im Datumsbereich

                  Hallo !

                  Danke für die Antwort !

                  Der 'primary key' ist der Spalte 'id' zugeordnet.

                  Ein Index erstreckt sich über die Spalten 'city', 'street' und 'housenumber'.
                  Ich habe diesen Index angelegt um einen 'full table scan' zu umgehen.


                  Heisst das jetzt, dass du für eine Kombination von 'city', 'street' und 'housenumber' für einen 'factor' mehrere Datensätze anlegen willst und zwar für jedes Datum in diesem Zeitraum einen?
                  Genau darum geht es.
                  Allerdings mit der Besonderheit, das ein bereits vorhandener
                  Datensatz geupdatet wird.
                  Ein nicht vorhandener Datensatz soll neu angelegt werden.


                  Hmmm... Hier haben wir wieder das Problem mit dem Schlüssel. Welcher DS in deinen Beispieldaten sollte denn geändert werden? Es gibt insgesamt 3 für city = 'cityA', street = 'streetA' und housenumber = '5'
                  Es sollen alle Datensätze mit den Spalteninhalten
                  city = 'cityA'
                  street = 'streetA'
                  housenumber = '5' und
                  die sich im betreffenden Datumsbereich befinden
                  geupdatet b.z.w. neu angelegt werden.

                  Ich bin für jede Information dankbar.

                  Mit freundlichen Grüßen

                  Stephan

                  Comment


                  • #10
                    Hallo,

                    wenn eine Eindeutigkeit auf 'city', 'street', 'housenumber' UND 'date' liegt, warum legst du den Index dann nicht als UNIQUE KEY über alle diese Felder, sondern nur über einen Teil?
                    Bei Vorhandensein eines passenden UNIQUE KEY lässt sich die Massgabe "Einfügen und bei Vorhandensein ändern" mit der INSERT ... ON DUPLICATE KEY UPDATE Syntax leicht realisieren.
                    Für deine Schleife in der SP benötigst du dann nur noch ein WHILE und zum Hochzählen des Datums die Funktion ADDDATE.

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment


                    • #11
                      Übergabe eines Array

                      Hallo !

                      Danke für die Antwort. Die Idee mit dem Unique Key ist super.
                      Und jetzt ein neuer Aspekt. Wenn nicht nur eine einzelne Konstante
                      übergeben wird, sondern ein Array. In Php ausgedrückt schwebt mir folgendes vor.

                      Ich möchte in einer Query eine Procedure aufrufen. An diese Procedure
                      wird ein Array übergeben. In der Prozedure wird dieses Array zerlegt.
                      Der Name des einzelnen Elementes ist der Spaltenname in der Tabelle.
                      Der Inhalt des Elementes ist der neue Inhalt der Spalte.

                      In Php würde ich folgendes schreiben.
                      ---------------------------------
                      $werte = array(
                      'spalte1' => 'aaa',
                      'spalte2' => 'bbb',
                      'spalte3' => 'ccc'
                      );

                      function myProcedureInMySQL($werte, $tabelle){
                      foreach($werte as $key => $value){
                      // baue Query
                      }

                      // führe Query durch

                      }

                      myProcedureInMySQL($werte, 'TestTabelle');

                      ---------------------

                      Lässt sich so etwas mit einer Procedure realisiern ?
                      Ich bin für jeden Hinweis dankbar.

                      Mit freundlichen Grüßen

                      Stephan

                      Comment


                      • #12
                        Hallo,

                        die Compound-Statement-Syntax von MySQL ist keine Hochsprache! Es ist eine Erweiterung zu SQL, um gespeicherte Prozeduren, Funktionen und Trigger realisieren zu können. Komplexe Datenstrukturen wie Arrays kennt MySQL nicht!

                        Ich halte es auch nicht für sinnvoll deine Aufgabenstellung in einer SP realisieren zu wollen. Das ist Aufgabe der Anwendung!

                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment


                        • #13
                          solved

                          Hallo !

                          Danke für die Information.
                          Leider hast du Recht.


                          Mit freundlichen Grüßen

                          Stephan

                          Comment

                          Working...
                          X