die existenz eines feldes ermitteln
ralphi
- datenbank
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
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
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
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
usw.
aber die funktionieren nicht bei allen SQL-Dialekten.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
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
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
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
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
-->
etcergebniss 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.
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
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
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
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.
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
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
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