Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL: Variable in INSERT

Einklappen

Neue Werbung 2019

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

  • SQL: Variable in INSERT

    Also ich würde gerne eine Variable als Zellenname definieren und mithilfe dieser dann einen INSERT durchführen.

    Problem ist, ich bekomme #1064 Fehler, Fehler in Syntax.

    SET @v = "id";
    INSERT INTO rennen (@v,bezeichnung)VALUES(63,"bsp");

    Mit Hoffnung auf eure Hilfe

  • #2
    Zur Planungszeit, wo also die Variable nicht bekannt ist, muß dem Planner bekannt sein, welche Tabelle(n) und Spalte(n) betroffen sind.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      julianbolte

      eine Variable als Zellenname definieren und mithilfe dieser dann einen INSERT durchführen.
      Dh du kennst zum Zeitpukt des INSERT die Feldnamen nicht? Halte ich spontan für DB-Fehldesign. Ev. solltest du da mal ansetzen?

      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Also die Tabelle hat Zellennamen wie A1 und A2.
        Ich muss diese dann für meinen Zweck dynamisch generieren.

        SET @var = CONCAT("A","1");
        INSERT INTO tabelle (id,@var)VALUES(1,"WERT")

        @var wird aber nicht erkannt. CONCAT kann ichc auch nicht direkt benutzen in INSERT.
        Wenn ich am Anfang DECLARE mache bekomme ich den Fehler "unbekannter Statement Typ".

        Kommentar


        • #5
          Das macht es nicht besser. Was Du suchst ist die Ausführung dynamischer Statements, https://www.postgresql.org/docs/11/p...-EXECUTING-DYN.
          Aber vermutlich suchst Du vielmehr als das ein gescheites Konzept.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Zitat von julianbolte Beitrag anzeigen
            Also die Tabelle hat Zellennamen wie A1 und A2.
            Ich muss diese dann für meinen Zweck dynamisch generieren.
            Und warum hast du so komische Namen? Und warum musst du diese (die Namen oder die Spalten selbst) dynamisch generieren? Eine Tabellenstrutkur sollte eigentilch nicht dynamisch zur Laufzeit erstellt oder angepasst werden. Das wäre dann wohl der zweite Punkt der in deinem DB-Design faul ist.

            Wenn du ein sauberes DB-Design hast, speziell in Punkto Normalisierung, traue ich mich fast wetten, dass du das nicht brauchst.

            https://www.peterkropff.de/site/mysq...alisierung.htm
            http://www.sqldocu.com/nine/normalform1.htm

            Zitat von akretschmer
            Aber vermutlich suchst Du vielmehr als das ein gescheites Konzept.
            Das glaub ich auch!

            julianbolte
            => Erkläre mal welche Struktur hast du, welche Daten müssen da rein?
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Um Variablen unter MySQL als Zellenname zu benutzen musst du dir ein dynamisches Statement zusammenbauen.

              Angedeutet:
              Code:
              SET @v = "id";
              SET @sql = CONCAT('INSERT INTO rennen...', @v ,'...');
              PREPARE stmt FROM @sql;
              EXECUTE stmt;
              ​​​​​​​Habe starke Zweifel ob dich das der Lösung deines Problems näher bringt. ​​​​​​​Denke besser nochmal über die Argumente von hausl ​​​​​​​und akretschmer nach.

              Kommentar


              • #8
                Zeige mal ein SQL-Dump deiner DB mit einigen wenigen Testdaten(max 10 Datensätze). Dann kann man dir sagen wie man es richtig macht.

                Kommentar


                • #9
                  Zitat von julianbolte Beitrag anzeigen
                  Also die Tabelle hat Zellennamen wie A1 und A2.
                  Ich muss diese dann für meinen Zweck dynamisch generieren.

                  SET @var = CONCAT("A","1");
                  INSERT INTO tabelle (id,@var)VALUES(1,"WERT")

                  @var wird aber nicht erkannt. CONCAT kann ichc auch nicht direkt benutzen in INSERT.
                  Wenn ich am Anfang DECLARE mache bekomme ich den Fehler "unbekannter Statement Typ".
                  Du bist, wenn du mir diese saloppe Formulierung erlaubst, "komplett im falschen Film". Was du da schreibst, basiert auf Excel bzw. Tabellenkalk.-Sheets.

                  Damit bist du, wenn du hier ein RDBMS (relationales Datenbankmanagementsystem) wie MySQL o.ä. nutzen möchtest, erstmal vollkommen falsch. Das "Tabellendenken" in Excel u.ä. ist ein völlig anderes, als in einem RDBMS. Ein Beispiel: Wenn deine Tabelle bspw. die Umsatzzahlen der 4 Quartale von drei Verkäufern derart auflistet, daß im "Tabellenkörper" die Umsätze stehen und an den Rändern die Quartale und Verkäufer, dann ist das für Excel ein ziemlich normaler Fall, für eine DB aber - wenn es den entspr. SQL-Dialekt "spricht" - das Ergebnis einer sog. "Kreuztabellenabfrage" auf eine Tabelle, die eine ganz andere Struktur haben müsste. Wenn in einem anderen Beispiel in der Tabelle Zeile für Zeile Adressdaten stehen, ist diese einer DB-Tabelle sehr ähnlich, aber mit hoher Wahrscheinlichkeit nicht "normalisiert". Das geht in Excel munter durcheinander.

                  Um also feststellen zu können inwieweit dein Datenbankmodell falsch ist (daß es falsch ist, steht zu 99,9% fest), müsste man es erstmal kennen. Dazu gehört auch, daß du schilderst, welche Realität deine DB abbildet und welche typischen Datenerfassungs- und -ausgabe-Aktivitäten dort stattfinden.

                  Nun direkt zu deinem hier als Problem der dynamischen Erzeugung von "Tabellen-Zellen" mißverstandenen Anwendungsfall:

                  Ich muß jetzt von einer möglichen Konstellation ausgehen, weil du ja Informationen über den realen Anwendungsfall noch nicht gegeben hast. "Rennen" ist ein Stichwort, also nehme ich mal provisorisch an, daß es sich um eine Tabelle handeln könnte, in der in der Vertikalen die Läufer stehen, in der Horizontalen Zwischenzeiten. Eine solche Tabelle entspräche nicht den Grundsätzen einer normalisierten relat. DB.

                  Trotzdem beantworte ich deine Frage erstmal unter der Annahme, daß diese Tabelle "regelwidrigerweise" so existiert. Dann kann man sich die Tabelle so vorstellen: die Spalten hätten folgende Bezeichnungen:
                  ID, A, B, C usw. z.B. bis Z. Kommen weitere Spalten hinzu, müssten die per "ALTER TABLE"-befehl eingefügt werden. Die IDs würden hier nicht per AUTOINCREMENT hinzugefügt, sondern direkt beim INSERT geschrieben werden, explizit.

                  Dann ergäbe sich folgende Entsprechung zwischen deiner Tabelle und ihren "Zellen" und den Variablennamen, die du "generieren" möchtest: Die "Zelle" D25 wäre dann bspw. der Wert in der Spalte D mit der ID 25. Ein Zugriff durch einen Selectbefehl würde dann so aussehen (Tabellenname "rennen"):
                  Code:
                  SELECT rennen.D FROM rennen WHERE rennen.ID = 25;
                  Insert- und update-befehle entsprechend.

                  Um es nochmal zu betonen: Das wäre von der Struktur in einem RDBMS komplett falsch, aber als Aktion "nur mal so" entsprechend umgesetzt.

                  Ein Abfrageergebnis auf die gesamte Tabelle entspräche dann einem zweidimensionalen Array. Es gibt php-Befehle, die dir das sofort so ausgeben, daß du es in einer php-Variablen speichern kannst, ansonsten kann man es auch in ein WHILE-Schleife im Anschluß an eine DB-Abfrage und
                  PHP-Code:
                  mysqli_fetch_array 
                  zeile für Zeile in ein neues Array reinschreiben, daß wäre aber eigentlich umständlich.

                  Die von dir "zu generierenden" Variablen wären dann nicht Parameter deiner SQL-Statements, die, wie du es vorhast, gar nicht gehen, sondern ganz einfache "Zellen" des Arrays, die dann nicht "A1", "D25" usw. heißen, sondern
                  PHP-Code:
                  $arrRennen["A"][1
                  ,
                  PHP-Code:
                  $arrRennen["D"][25
                  usw.

                  Aber nun bitte zuerstmal dein "Realmodell"! Und den von protestix in #8 angeforderten Tabellen-Dump!

                  Kommentar


                  • #10
                    MySQL erlaubt keine Variablen für Tabellen- und Spaltennamen.
                    #7 beantwortet die Frage und zeigt die Lösung.

                    Kommentar


                    • #11
                      Zitat von kaminbausatz Beitrag anzeigen
                      MySQL erlaubt keine Variablen für Tabellen- und Spaltennamen.
                      #7 beantwortet die Frage und zeigt die Lösung.
                      Das ist nicht auf MySQL begrenzt, habe ich in #2 schon erklärt.
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        Zitat von akretschmer Beitrag anzeigen

                        Das ist nicht auf MySQL begrenzt, habe ich in #2 schon erklärt.
                        Oh je, ich wollte dich nicht brüskieren, war keine Absicht.

                        Kommentar


                        • #13
                          Zitat von kaminbausatz Beitrag anzeigen
                          MySQL erlaubt keine Variablen für Tabellen- und Spaltennamen.
                          #7 beantwortet die Frage und zeigt die Lösung.
                          Was auch immer der TE vor hat: Nur weil er - vermeintlich kompetent klingend - von einer dynamischen Zuweisung von Tabellen- und Spaltennamen redet, muß das nicht zur Lösung seines Problems von Relevanz sein. Wenn er oben in seinem Eingangsstatement bereits weiß, daß @v = "id", warum ersetzt er dann in seinem SQL-Statement nicht einfach das eine durch das andere? Sieht nach "Wer keine Probleme hat, der macht sich welche!" Damit läßt sich gut vom Wesentlichen ablenken.

                          Er soll erstmal sagen, was er vorhat, dann wird sich schon eine Lösung finden. Bis dahin trägt er höchstens zur Unterhaltung bei. Da jetzt jeder offenbar einen Beitrag nennen darf, der die Lösung beinhaltet, sage ich: #3.

                          Kommentar


                          • #14
                            Variable Spaltennamen:
                            Wie schon geschrieben, das geht nicht ohne weiteres. In manchen RDBMS geht sowas ähnliches.

                            Ausweg 1: Das Statement verwendet alle verfügbaren Spalten und die Dynamik wird durch die Wertebestückung erreicht.
                            Ausweg 2: Du baust das Statement komplett dynamisch zusammen.

                            Beides hat ein paar Nachteile, welche auch schon angeklungen sind. Am wichtigsten die Frage: Warum möchtest Du das so machen?
                            Es gibt im Prinzip 2 Antworten:
                            a) ich komme aus dem Tal der Ahnungslosen
                            b) es muss bzw. soll wirklich dynamisch sein, weil es den Anforderungen entspricht.

                            Spaltennamen A1, A2 usw.
                            Es wird gern drauf rumgehackt, wenn die Spalten so genannt werden. Und es kann tatsächlich ein Zeichen für Variante a) vorige Frage sein.
                            Es kann aber genausogut ein Zeichen für b) sein. Das sind dann echt interessante Fälle. Dynamik, bei der im Grunde in gewissem Rahmen egal ist, wie die Spalte heißen.
                            Hier kann es leicht sein, das man mit einem klassischen RDBMS einfach auf dem falschen Pferd sitzen. Man denkt dann vielleicht eher an noSQL und document orientierte Datenhaltung.

                            Also, da gibt's bestimmt was von Ratiopharm, Du musst nur sagen, was hinter Deinem Problem steckt.

                            Kommentar


                            • #15
                              Zitat von Perry Staltic Beitrag anzeigen
                              Variable Spaltennamen:...

                              Spaltennamen A1, A2 usw.
                              Es wird gern drauf rumgehackt, wenn die Spalten so genannt werden. ...
                              Du bist auf dem falschen Dampfer: Er will variable Zellennamen, nicht Spaltennamen.
                              Also, da gibt's bestimmt was von Ratiopharm, Du musst nur sagen, was hinter Deinem Problem steckt.
                              Er möchte mit einer Datenbank sowas wie Excel bauen, um Ergebnistabellen von irgendwelchen Wettrennen, Sackhüpfen oder sonstwas zu speichern. Für genauere Details müssen wir auf den Tag warten, wo er deine Frage beantwortet...

                              Kommentar

                              Lädt...
                              X