Autor Beitrag
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.11.04 17:37 
Hallo ! Ich habe eine einfache Frage:

Wie bekomme ich bei einen gegebenen TQuery (TTable)-Komponente heraus, welche Felder die Primärschlüssel sind ? Gibt es da irgend eine Methode a la Q1.PrimaryKeys oder Q1.Fields.GetPrimaryKeys, mit der ich sie schnell auslesen kann ?
Ich habe viele Tabellen, und möchte dynamisch abfragen ausführen, für die ich aber alle Primärschlüssel brauche (für ne SQL-Query ..)

Hat einer nen Tipp ?

Danke, :o
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.11.04 17:47 
Mit SQL-Statement "DESC" bzw. "DESCRIBE" Tabellenstruktur ausgeben lassen und direkt nach dem Schlüssel suchen. Bei einigen Datenbanken geht auch "SHOW INDEX"

Viele Grüße,

Matthias

_________________
Ha! Es compiliert! Wir können ausliefern!
MartinPb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Fr 12.11.04 19:19 
neojones hat folgendes geschrieben:
Mit SQL-Statement "DESC" bzw. "DESCRIBE" Tabellenstruktur ausgeben lassen und direkt nach dem Schlüssel suchen. Bei einigen Datenbanken geht auch "SHOW INDEX"


Soweit ich weiß ist DESC (die Kurzform von DESCRIBE) kein SQL-Statement und hat auch sonst mit SQL Abfragesprache nichts zu tun. Ich kenn zwar nicht alle Datenbanken und weiß deshalb nicht wie es bei den anderen ist, aber bei ORACLE ist das ein SQL*Plus Befehl. Mit DESC kann man sich die Tabellenstrucktur in der SQL*Plus Umgebung anzeigen lassen. Ich weiß nicht wie es bei den anderen Datenbanken ist, aber DESC zeigt nur die Feldnamen, Typen und Null? Informationen.

ausblenden Quelltext
1:
2:
3:
4:
5:
SQL> desc test
Name              Null?    Typ
-----------------+--------+------------
COL1              NOT NULL NUMBER(4)
COL2              NULL     VARCHAR2(10)


Die Informationen über Primärschlüssel muß man in einer Tabelle suchen. Bei Oracle ist das die Tabelle USER_CONSTRAINTS oder ALL_CONSTRAINTS. Wo das in anderen Datenbanken steht weiß ich allerdings nicht.

Welche Datenbank ist es bei dir?

_________________
Gruß
Martin
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.11.04 21:51 
Hallo !

Ich benutze Delphi 6 Pro, und meine Anwendung arbeitet mit Paradox 7 - Tabellen / Datenbanken.

Zum Einsatz kommen TQuery, TTable - Standardkomponenten von D6.

Der Hintergrund:
Ich habe mit eine Funktion geschrieben, um Tabellen (Abfragen) in eine CSV-Datei zu exportieren ( könnte auch jede andere Art sein -- ich habe einfach csv genommen, weils so recht einfach zu speichern ist). Diese CSV-Datei lese ich Online mit PHP aus und füge alles entsprechend in eine MySQL-Datenbank ein. Beim Einfügen möchte ich aber alle Datensätze nur aktualisieren, die schon vorhanden sind, und da man nu nicht immer nur einen PriKey hat, lege ich die CSV-Datei so an, das die erste Zeile alle Primärschlüssel enthält, die zweite alle Feldnamen und danach Daten.
Nun habe ich aber den Anspruch, :wink: die blöden Primärschlüssel abhängig von der aktuellen Tabelle / Query herauszufinden (es soll ne function a la "QueryToCSV" werden), und will sie nicht statisch angeben, was ich zwar im Moment als zwischenlösung tue, aber es ist ja nicht so das wahre vom Ei !

Ach ja:
Wenn sich natürlich jetzt jemand wegen der Umwege an den Kopf haut, und eine direkte Lösung in der Tasche hat, wie ich aus einem Delphi-Programm direkt zu einer Online-MySQL-Datenbank connecten und tabellen abgleichen kann, der bekommt ne virtuelle Kiste Bier :D !!

thx @ all,
Sebastian01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows XP
D7
BeitragVerfasst: Mo 15.11.04 15:08 
Hi !

wieso, ob du eine mySQL-Datenbank lokal oder von aussen connectest ist eigentlich egal. Lediglich muss die Berechtigung für den Benutzer mit einer IP Adresse (oder von allen Adressen) in mysql (Datenbank Mysql, Tabelle User und ggf. Tabelle DB) gesetzt sein.
Ob man wirklich eine mySQL-DB nach aussen potenziell öffnen möchte, ist eine andere Sache. Ich persönlich binde die mySQL-Prozess auf unseren Internet Servern immer nur an localhost, so daß die Datenbank von aussen auf Port 3306 überhaupt gar nicht sichtbar ist - auch das könnte noch ein Grund sein, warum das bei dir nicht klappt.

Persönlich gehe ich auch den Weg über .csv Dateien, die ich allerdings mit "LOAD INFILE" einlese (mySQL), weil das schön schnell ist, verglichen mit einem Parser in PHP zum Beispiel.

So, dann man her mit der Kiste :-)


lg
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 16.11.04 20:06 
Tagchen !

Die DB nach aussen sichtbar zu machen riskiere ich nicht, obgleich nichts wichtiges drinsteht. Das ist aber nebensächlich, ich möchte eigentlich nur mein ausgangsproblem lösen ... Es läuft ja schon, nur wenn einer ne schnelle methode wüsste ;-)

Danke aber an alle für die schnelle Antwort!
Gruß
Sebastian01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

Windows XP
D7
BeitragVerfasst: Di 16.11.04 23:01 
Gut, also TTable Komponenten - über die BDE angesprochen ?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  // Indizes holen
  CreateIndizes:='';
  BDETable.Exclusive:=true;
  // Aktuell verfügbare Indizes abrufen
  BDETable.IndexDefs.Update;
  for i := 0 to BDETable.IndexDefs.Count - 1 do begin
    // Index bauen, in Anführungszeichen mit Tabellennamen vorweg,
    // damit evt. Leerzeichen ebenfalls korrekt gahandelt werden
    IndexFields:=stringreplace(BDETable.IndexDefs.Items[i].Fields, ';', '", "'+ NewName +'"."', [rfReplaceAll, rfIgnoreCase]);
    IndexFields:='"'+ NewName +'"."'+IndexFields+'"';
    if (i=0) then begin
      // Primärindex
      Create:=Create+', Primary Key ( ' + IndexFields + ')';
    end else begin
      if (CreateIndizes<>'') then CreateIndizes:=CreateIndizes+' ';
      CreateIndizes:=CreateIndizes+ 'CREATE INDEX ' + BDETable.IndexDefs.Items[i].Name + ' ON "' + NewName + '" (' + IndexFields + ');';
    end;
  end;
  BDETable.Exclusive:=false;


Kommt aus einer Routine, die von paradox-Tabellen ein "Create Table" baut.

Hoffe es hilft !

lg