Entwickler-Ecke
Datenbanken - Primärschlüssel herausfinden ?!?
Delete - Fr 12.11.04 17:37
Titel: Primärschlüssel herausfinden ?!?
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 - 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
MartinPb - 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.
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?
Delete - 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 - 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
Delete - 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 - Di 16.11.04 23:01
Gut, also TTable Komponenten - über die BDE angesprochen ?
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!