ralphi: die existenz eines feldes ermitteln

hi leute,

ich suche bislang erfolglos einen SQL-Befehl, mit dem ich prüfen kann, ob die Spalte (zB. Ort) in einer Tabelle schon existiert.

kann mir jemand helfen
grüße ralphi

  1. Hello,

    ich suche bislang erfolglos einen SQL-Befehl, mit dem ich prüfen kann, ob die Spalte (zB. Ort) in einer Tabelle schon existiert.

    Das hängt ganz empfindlich vom DBMS und seiner Rechteverwaltung ab.
    Wenn Du nämlich in einem DBMS auf die Spalte ORT keinerlei Zugriff hast, darfst Du ihre Existenz ggf. auch gar nicht sehen. Wenn Du dann versuchst, eine solche Spalte anzulegen, bekommst Du ggf. eine nichtssagende Fehlermeldung und einen Eintrag im Error-Log des Systems.

    Ein anderes System gibt Dir aber ggf. bereitwillig Auskunft darüber, dass die Spalte existiert, Du aber keinerlei Zugriff darauf hast.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. hi tom,

      alles viel einfacher - bin immer noch anfänger ;)

      die Aufgabe ist eine csv-datei in die db einzulesen, wobei ich nicht weis, was alles für felder auftauchen (ziemlich groß).

      mit 'alter table' möchte ich dann meine tabelle um ein mögliches neues feld in einer while (!feof($datei)) {Schleife erweitern. deswegen benötige ich eine abfrage ob das feld xy schon existiert.

      zugriffsrechte sind alle da.

      grüße ralphi

      1. Hello,

        alles viel einfacher - bin immer noch anfänger ;)

        die Aufgabe ist eine csv-datei in die db einzulesen, wobei ich nicht weis, was alles für felder auftauchen (ziemlich groß).

        Bleibt trotzdem noch die Frage, um welches DBMS es sich handelt.
        Es gibt SQL-Statements, wie

        • Display Tables
        • Show tables
        • display columns from $table
        • show columns from $table

        usw.

        aber die funktionieren nicht bei allen SQL-Dialekten.

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Hi Ihr,

          also ich hab xampp unter win.

          aber der lösungsansatz sollte nicht sein ständig die tabelle nach feldern abzufragen, die schon vorhanden sind und dann in einer schleife zu vergleichen.

          in dem fall könnte ich auch einfach eine neue tabelle anlegen in dem ich schon eingelesene felder hinterlege und jedesmal aufrufe.

          eine elegante möglichkeit: sinngemäß - 'exist xy in tabelle' sollte es schon sein ;)

          wenn keiner was kennt, werde ich wohl in jeder csv-zeile eine schleife laufen lassen müssen :(

          grüßle ralphi

          1. Hi,

            aber der lösungsansatz sollte nicht sein ständig die tabelle nach feldern abzufragen, die schon vorhanden sind und dann in einer schleife zu vergleichen.

            genau das ist aber absolut erforderlich. Die Frage kann eigentlich nur sein, mache ich (also der Programmierer und später bspw. das Kompilat) das oder steht mir eine SQL-Syntax zur Verfügung, die eine "automatische bei Bedarf Tabellenerweiterungssyntax horizontal" bietet?

            Letztere gibt es nicht. Ich denke, dass es dafür einige gute Gründe gibt. Bspw. könnte eine sich horizontal aufblähende Tabelle mit der Blockphilosophie beissen, RDBMSe verwalten intern Datenblöcke, bspw. der Grösse 8k (MSSQL Server).

            in dem fall könnte ich auch einfach eine neue tabelle anlegen in dem ich schon eingelesene felder hinterlege und jedesmal aufrufe.

            Nein, kannst Du eigetnlich nicht, bei grösseren Datenmengen und regelmässigen  Datenzugriffen würde der DB-Server nicht mehr zu rödeln aufhören.

            eine elegante möglichkeit: sinngemäß - 'exist xy in tabelle' sollte es schon sein ;)

            Lies Dich mal in die Datentransformationstools ein, die Dein RDBMS (vielleicht) bietet. Die sind extra auch für Datenim- und -export gedacht.

            wenn keiner was kennt, werde ich wohl in jeder csv-zeile eine schleife laufen lassen müssen :(

            Schleifen sind schon ganz OK. (Aber warum in jeder Zeile?! Es geht doch eher um Zeile Nr.1.)

            MFG
            Mojo - 1

            1. Hi Mojo,

              schön das du noch wach bist.

              Schleifen sind schon ganz OK. (Aber warum in jeder Zeile?! Es geht doch eher um Zeile Nr.1.)

              das mit der csv ist blödsinn von mir - es handelt sich um eine textdatei mit 2 spalten. in der ersten sind die feldnamen und in der 2. der inhalt. die einzelnen datensätze sind von einem seitenumbruch getrennt:

              zB:
              Name: müller
              ort: LA
              -->
              Name: ralphi
              Schugröße: 32
              -->
              etc

              ergebniss sollte sein:
              Name - ort - schuhgröße
              müller - LA -
              ralphi -  - 32

              die felder sind vielzählig und manuell unsinnig zu erfassen

              das so ein befehl selten gebraucht würde ist mir klar - hätte ja sein können, dass es jemand schon nutzen musste ;)

              grüßle ralphi

              1. Hello,

                das mit der csv ist blödsinn von mir - es handelt sich um eine textdatei mit 2 spalten. in der ersten sind die feldnamen und in der 2. der inhalt. die einzelnen datensätze sind von einem seitenumbruch getrennt:

                zB:
                Name: müller
                ort: LA
                -->
                Name: ralphi
                Schugröße: 32
                -->
                etc

                ergebniss sollte sein:
                Name - ort - schuhgröße
                müller - LA -
                ralphi -  - 32

                Du hast also ein Datenformat mit Pärchen  Name:Wert und sogenannten varianten Records vorliegen.
                Wenn die Datei nicht zu groß ist (bis 2MB geht es problemlos möchte ich mal schätzen), ist das eine excellente Musteraufgabe für verkettete Listen (Bäume), so wie sie bei PHP als "Array" implementiert sind.

                • Du brauchst eine Funktion, die die Datensätze voneinander trennt
                • Du brauchst eine Funktion, die für jeden Datensatz die Bezeichner
                    und die dazugehörigen Werte ermittelt
                • Du brauchst eine Funktion, die die ermittelten Daten ins Array einträgt

                Um nachher in beide Dimensionen (Satznummer und Satzaufbau) sofort ermitteln zu können, kannst Du das Array folgendermaßen aufbauen:

                $_data = Array();

                $_data['name'][1] = 'müller';
                  $_data['ort'][1]  = 'LA';

                $_data['name'][2] = 'ralphi';
                  $_data['schuhgroesse'][2] = 32;

                usw.

                Das gibt ein lückenbehaftetes "Spaltenarray".
                Das lässt sich nachher mit den Arrayfunktionen (insbesondere array_keys() und foreach()) besonders leicht manipulieren und in jede andere Form transformieren oder normalisieren zu Tabellen.

                Wenn Du die Zuweisungen oben genauer anschaust, findest Du noch mehr Fallstricke. Die Bezeichner sollten für das Array behandelt (normiert) werden. Überlege, ob Du wirklich Groß-/Kleinschreibung willst und was mit Sonderzeichen geschehen soll.

                Fang erstmal an, die drei Grundfunktionen zu entwickeln und poste sie hier. Dann sehen wir weiter.

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Hello,

                  > Name: müller
                   > ort: LA
                   > -->
                   > Name: ralphi
                   > Schugröße: 32
                   > -->

                  oder so, all in one... :

                  <?php
                  error_reporting(E_ALL);

                  $dateiname = '            ';

                  $_file = file($dateiname);

                  $count = 1;
                  $_data = array();
                  $sep = ':';

                  foreach($_file as $parampairs)
                  {
                    $parampairs = trim($parampairs);  ## Whitespaces entfernen

                  if (strlen($parampairs) == 0)     ## ies es eine Leerzeile?
                    {
                      $count++;
                    }
                    else                              ## nee, ist keine, also Daten extrahieren
                    {
                      $_record = explode($sep,$parampairs);

                  if (count($_record) > 2)
                      {
                        ## Fehlerbehandlung oder Zeile merken usw.
                      }
                      elseif(count($_record) == 0)
                      {
                        ## Fehlerbehandlung oder Zeile merken usw.
                      }
                      else
                      {
                        $key = strtolower($_record[0]);    ## eventuell auch noch Sonderzeichen behandeln
                        $val = '';
                        if (isset($_record[1])
                        {
                          $val = $_record[1];
                        }

                  $_data[$key][$count] = $val;
                      }
                    }
                  }

                  echo "Die Feldnamen lauten:<br>\n";
                  echo implode(' | ',array_keys($_data))."<br>\n";

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

                  1. Hi tom,

                    vielen dank für deine antwort. du hast mir jetzt gezeigt, wie ein ordentlicher php code auszusehen hat und wie ich die daten in dicke arrays schreiben kann - das eigentliche problem ist allerdings wie ich das ding in die DB bekomme.

                    folgendes habe ich gestern noch hinbekommen:

                    //1. Teil neue Felder erkennen und anfügen
                    //2. Teil Daten sammeln und bei leerzeile in DB schreiben - funktioniert noch nicht!

                    while (!feof($datei)) {
                      // Zeile einlesen und trennen
                     $zeile = fgets($datei,1000);
                     $feld = explode(":  ",$zeile);

                    // hier prüfe ich ob ein neuer datensatz anfängt - die sind mit einem seitenumbruch UND einer leerzeile getrennt
                     If ($feld[0] == "") $new=1;

                    echo $x . "datensatz einlesen";
                     $x=$x+1;

                    If ($feld[0] != "") {
                    //**************************
                     // felder mit vorhanden feldern vergleichen
                     $res = mysql_query(sprintf("select * from felder "));  $n=0;
                     while ($row =mysql_fetch_array($res)) {
                      If ($row[feld] == $feld[0]) $n=1;
                      }
                           // wenn noch nicht vorhanden - schreibe das neue feld in die hilfstabelle
                           If ($n == 0) {
                     mysql_query(sprintf("insert into felder (feld) VALUES ('%s')", $feld[0]));
                           // und erweitere um das neue feld

                    mysql_query(sprintf("alter table kstamm1 add column
                     %s  character(255)", $feld[0] ));
                    //**********************
                      }

                    //Daten als string sammeln bis die leerzeile kommt
                     $feldname =$feldname . ", " .$feld[0]  ;
                     $daten =$daten . ", " .$feld[1]  ;

                    }
                     //und rein mit dem datensatz - aber das funktioniert noch nicht
                     if ($new == 1) {
                      mysql_query(sprintf("insert into kstamm1 ('%s') VALUES ('%s')",
                      $feldname,$daten));

                    $feldname= "";
                     $daten = "";
                     $new = 0;

                    }
                    }
                    fclose($datei);

                    Die felder zufügen funkt schon ganz gut - leider funkt der letzte insert noch nicht (vielleicht nur ein syntaxfehler)

                    ich hoffe man kann auch meinen code ansatzweise lesen ;)
                    mit bitte um hilfe
                    grüßle ralphi

                    1. Hello Ralphi,

                      vielen dank für deine antwort. du hast mir jetzt gezeigt, wie ein ordentlicher php code auszusehen hat und wie ich die daten in dicke arrays schreiben kann - das eigentliche problem ist allerdings wie ich das ding in die DB bekomme.

                      Es fehlen mir noch ein paar Angaben, um eine praxisgerechte Antwort zu geben.

                      • Wieviele Zeilen enthält die Quelldatei?
                      • wie groß ist sie in Bytes?
                      • kann man sie ggf. teilen?

                      Hast Du schon mal die Umwandlung in ein Array durchgeführt?
                      Wurden Dir die Spaltennamen richtig ausgegeben?

                      Hast Du schon eine Tabelle in der DB?

                      Harzliche Grüße vom Berg
                      http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau

      2. Hallo Ralphi,

        die Aufgabe ist eine csv-datei in die db einzulesen, wobei ich nicht weis, was alles für felder auftauchen (ziemlich groß).

        es gibt Datenbankmanagementsysteme, die Tools zur Verfügung stellen, um CSV einzulesen :-)

        Deswegen bitte ich Dich ebenso wie Tom: Verrate uns Dein Datenbankmanagementsystem. Dann können wir Dir viel gezielter helfen.

        Freundliche Grüße

        Vinzenz

  2. Yo!

    ich suche bislang erfolglos einen SQL-Befehl, mit dem ich prüfen kann, ob die Spalte (zB. Ort) in einer Tabelle schon existiert.

    Ich weiss fast die Lösung!!!

    SELECT TOP 0 * FROM DB_TABLE (MSSQL-Syntax)
    SELECT * FROM DB_TABLE LIMIT 0 (vermutete MySQL-Syntax, ggf. mal die LIMIT-Klauselsyntax prüfen!)

    Dann nur noch die Spaltenauflistung durchgehen.

    CU
    Mojo - 1