Unbekannten PRIMARY KEY bestimmen



  • Hallo zusammen...

    Ich habe folgendes Problem: Ich habe eine Anbindung an eine mir unbekannte Datenbank. Das Auslesen der Struktur (Tabellen, Spalten, etc.) hab ich bereits. Nun brauch ich aber noch die Informationen, ob (und wenn ja welche) Spalten als PRIMARY KEY in der jeweiligen Tabelle funktionieren. Kennt jemand eine mögliche SQL-Abfrage, mit der ich die entsprechende Tabelle bekomme?

    Vielen Dank,
    Hannes



  • Solche Informationen sind im Data Dictionary zu finden - das kommt also sehr stark auf die verwendete Datenbank drauf an.

    MfG SideWinder



  • das bedeutet, dass ich da nicht allgemein dran komme? ich habe halt ein programm, das dynamisch auf unterschiedlichste datenbanken zugreift... aber ich habe vorher die möglichkeit bestimmte einstellungen bezgl. der speziellen datenbank vorzunehmen.

    also: ich habe ein allgem. lauffähiges programm, was auf vielen unterschiedlichen datenbanken läuft, aber was im wirkl. einsatz (wenn es dann verkauft wurde) nur auf einer datenbank läuft... ich schreib halt nicht jedes mal ein neues programm, das auf die datenbank angepasst ist.

    ich hab mich irgendwie komisch ausgderückt, aber ich hoffe, dass ihr mich verstanden habt?!

    LG, Hannes



  • Da bleibt wohl keine andere Möglichkeit als für jede unterstützte Datenbank eine eigene Implementation zu schreiben. Einen allgemeinen SQL-standardisierten Weg für den Zugriff auf das Data Dictionary gibt es meines Wissens nicht.

    Um mit Datenbanken aber vernünftig und vor allem optimiert zu arbeiten ist ein gewisses Maß an Spezialisierung ohnehin von Nöten.

    MfG SideWinder



  • SHOW CREATE TABLE tablename liefert die erforderlichen Infos... Da kann ich dann PRIMAYRY KEYS auslesen



  • Das funktioniert jetzt vielleicht bei der Datenbank die du gerade verwendest. Die Oracle-Datenbank hat jedenfalls afaik keinen solchen Befehl.

    MfG SideWinder



  • aber wenn die ich einen "SQL-Treiber" für die datenbank habe, dann müsste es doch laufen, oder?!



  • Wie greifst du denn auf die Datenbanken zu? Bei ODBC gibt's z.B. eine Funktion mit der du den Primary Key abfragen kannst.



  • Ich habe ein ähnliches Problem:
    Allerdings kenne ich die Datenbank, MySQL.
    mit:
    show columns from Tabellenname
    bekomme ich eine tabelle wo auch eingetragen ist was der Primarykey ist. Aber ich kann kein where anhängen, also

    show columns from tabellenname where Key = 'PRI';
    ABER:
    show columns from tabellenname where Field = 'ID';
    funktioniert.

    Kann mir jemand sagen warum das so ist?
    PS LIKE geht auch nicht. Ist das aus sicherheitsgründen so, oder warum?
    Ich hätte gerne nur eine Entität als ergebnis damit ich den Spaltenname gleich habe, ohne Stringverarbeitung, da ich mich in PHP net ganz so auskenne.

    mfg



  • Ich bin jetzt etwas weiter gekommen, anscheinend ist key das Problem da es für MySQL ein Schlüsselwort ist. Hat jemand eine Idee? Kennt einer eine Escape-sequenz dafür? oder geht es auch mit 'as' irgendwie?

    mfg



  • OK ich habe jetzt eine Lösung:

    use information_schema;
    select column_name from columns where column_key = 'PRI' and table_name = 'tabellenname';



  • Normalerweise kann der Client-Treiber die nötigen Informationen bereitstellen. Unter ADO gibt es dafür z.B. die OpenSchema Funktion. Allerdings ist auch dies stark treiberabhängig genau wie das Beispiel oben nicht auf allen DBs funktionieren wird. Das ganze ist so ein typisches Problem relationaler Datenbanken bzw des SQL Dialekts. Das ganze ist nicht wirklich genormt und jeder Datenbank-Entwickler backt seinen eigenen Kram.



  • mit der odbc funktion - SQLPrimaryKey() - kannst du von jeder datenbank, die odbc unterstützt, die namen der spalten abfragen, die den primary key bilden. Man muss also keinen direkten zugriff auf das data dictionary haben, denn jeder hersteller hat ja heute noch sein eigenes DD. in der sql2003 norm ist allerdings nun zum ersten mal das DD auch genormt worden, wird aber noch einige jahre dauern, bis alle db anbieter dieses genormte DD haben werden. solange kannst du ja SQLPrimaryKey() benutzen.
    viele grüsse, tesuji



  • ich brauche ein SQL-Statement, das für eine Tabelle jene Attributr liefert, welche zum Primärschlüssel gehören.
    Ich arbeite auf einer MS SQL Server DB
    Hoffe, Ihr könnt mir helfen.

    Danke schonmal vorab!

    greetz, m4sl



  • @dam4sl: Das kannst du dir leicht aus den Systemtabellen konstruieren. Schau dir mal diese übersicht über sql server systemtabllen an:
    http://www.microsoft.com/sql/prodinfo/previousversions/systables.mspx
    mit dem bild in systbl.zip kommst du dann weiter.



  • vielen dank, das hilft mir wirklich weiter in dem gewirr von tabellen durchzusehen 🙂
    schönen Tag noch!

    cu


Anmelden zum Antworten