mySQL -> 2 primärschlüssel in einem fremdschlüssel?
Hiho.
Ich habe ein kleines Problem. Zwei Tabellen habe ich, eine Tabelle ist eine Liste mit Software, es sind zwei Spalten: Einmal die CD Nummer und der Name der Software, der allerdings öfters vorkommt, da manche Software doppelt vorhanden ist.
In einer zweiten Tabelle sind ebenfalls zwei Spalten, einmal der Name des Rechners und des darauf installierten Programms.
Und das ist das Problem. Die Spalte mit den installierten Programmen soll auf die Tabelle mit den Programmen verweisen und daraus den Namen beziehen. Allerdings möchte ich, dass in der zweiten Tabelle die Programme namentlich genannt werden und nicht nur deren IDs. Auf die Spalte mit den Programmnamen kann ich nicht verweisen, denn das ist kein Primärschlüssel und er hat auch nicht die Voraussetzungen, um einer zu sein. Wenn ich auf die ID verweise, dem Primärschlüssel, dann kriege ich nur die Nummer angezeigt.
Einen Primary-Key-Verbund in der ersten Tabelle habe ich auch versucht, allerdings kann ich nur auf eine Spalte verweisen, und zwar die ID. Auf die Namen nicht, auch wenn sowohl PK-Spalte als auf FK-Spalte die gleichen Datentypen haben, kann die Operation nicht durchgeführt werden (Fehlernummer ist 150, aber da hat Google nichts brauchbares ausgespuckt).
Kann mir vielleicht jemand einen Tipp geben?
5 Antworten
Man kann mit zusammengesetzten Schlüsseln genauso arbeiten wie mit einfachen, auch die Verwendung als Fremdschlüssel geht. Wenn man nach Datenfelder außerhalb des Primärschlüssels häufig sucht, kann man dafür einen Index definieren. Wenn man einen eindeutigen braucht (muss nicht unbedingt sein) oder haben will, kann man den Primärschlüssel zum Index hinzufügen. Beim Suchen muss man nicht den vollständigen Index angeben, den hinteren Teil kann man weg lassen.
Select S.Name, from rechner r join software s on s.name = r.name
Hmm ... mit JOIN habe ich mich noch nicht beschäftigt ... dient das nur zur Anzeige oder kann man damit auch wirklich konstante Veränderungen vornehmen?
Du kannst auf die Tabelle verweisen und musst natürlich auch auf den Primary Key verweisen. Aber du kannst mit Select den Namen der Spate wählen.
Wenn du alle Tabellen verknüpft hast, findet er die Spalten, die du suchst. Da musst du nichts mehr machen...
also wenn ich mich recht erinnere:
Select gewünschte Spalte
From Tabelle a, Tabelle b
weitere Befehle
Kannst du mal bitte den SQL-Code Posten den du schon gemacht hast ?
Der Code lautet etwa so:
create table bla1( id INT(10); name VARCHAR(50), PRIMARY KEY (id));
create table bla2( name VARCHAR(50));
In das Feld "name" von bla2 sollen sowohl ID als auch Name von Tabelle bla1 geschrieben werden.
In einer select-Anweisung kannst Du nach allen Datenfeldern suchen, egal ob Primärschlüssel oder nicht. Ist die Tabelle sehr groß oder die Verknüpfungen von mehreren Tabellen erfolgen über solche Felder, kann die Antwort u.U. zu lange dauern. Als Abhilfe kann man auf Datenfelder oder Kombinationen von Datenfeldern, die häufig für Suche und Verknüpfung und Sortierung verwendet werden, einen Index definieren (auf- oder absteigend ggf. getrennt, wenn beide benötigt werden). Der Index muss nicht eindeutig sein (man darf dann nicht unique bei der Definition angeben). Die Definition von Indizes wird meist im Nachhinein durchgeführt, wenn man weiß, welche Abfragen zu lange dauern. Mitunter muss man da auch etwas herumprobieren. Das ist üblich bei einer Datenbankkonzipierung, manche Datenbankhersteller bieten spezielle Software zum Herausfinden von solchen Schwachstellen.