Probleme mit MYSQL und mehreren Primary Keys
SSchrickel
- datenbank
0 srob0 SSchrickel0 Michael Schröpl0 srob
0 SSchrickel
Hallo an Alle,
habe hier ein wirkliches Problem mit MySQL. Ich scheitere an der Definition von zwei Primary Keys in einer Datenbanktabelle. Dies geht ja zum Glück noch. Im nächsten Schritt allerdings sollen entsprechend zu den Keys auch Constraints definiert werden. Dabei nimmt MySQL aber immer nur den als ersten definierten Primary Key. Ich verwende MySQL und InnoDB. Kann mir jemand weiterhelfen wie es auch führ beide Schlüssel zu lösen ist?
Anbei habe ich den entsprechenden Quellcode.
-- **********************************
-- * Standard SQL generation *
-- * Thu Jul 03 15:45:41 2003 *
-- **********************************
-- Database Section
-- ________________
-- create database Buchverwaltung;
-- DBSpace Section
-- _______________
-- Table Section
-- _____________
create table Buch (
ISBN numeric(10) not null ,
Autoren char(20) not null ,
InventarNR numeric(10) not null ,
Titel char(30) not null ,
primary key (ISBN)) Type=InnoDB;
create table Lehrveranstaltung (
LV_Nr numeric(5) not null ,
LV_Name char(20) not null ,
Gebäude char(10) not null ,
Raum numeric(5) not null ,
Straße char(20) not null ,
primary key (LV_Nr)) Type=InnoDB;
create table empfiehlt (
ISBN numeric(10) not null ,
LV_Nr numeric(5) not null ,
primary key (ISBN, LV_Nr)) Type=InnoDB;
-- Constraints Section
-- ___________________
-- alter table Lehrveranstaltung add constraint
-- check(exists(select * from empfiehlt
-- where empfiehlt.LV_Nr = LV_Nr));
alter table empfiehlt add constraint FKemp_Buc
foreign key (ISBN)
references Buch(ISBN);
alter table empfiehlt add constraint FKemp_Leh
foreign key (LV_Nr)
references Lehrveranstaltung(LV_Nr);
An der Stelle wird lediglich der Constraint für ISBN gebildet, es werden in der Anwendung jedoch beide benötigt.
-- Index Section
-- _____________
create unique index IDBuch
on Buch (ISBN);
create unique index IDLehrveranstaltung
on Lehrveranstaltung (LV_Nr);
create unique index IDempfiehlt
on empfiehlt (LV_Nr, ISBN);
create index FKemp_Leh
on empfiehlt (LV_Nr);
create index FKemp_Buc
on empfiehlt (ISBN);
Schon jetzt vielen Dank für Eure Hilfe.
PS: Bin neu hier und bitte darum eventuelle Formfehler zu entschuldigen.
Hallo an SSchrickel,
habe hier ein wirkliches Problem mit MySQL. Ich scheitere an der Definition von zwei Primary Keys in einer Datenbanktabelle.
hast da ein wirkliches Problem mit der Theorie relationaler DB-Systeme. Per Definitionem kann eine Tabelle nur einen Primärschlüssel besitzen (oder keinen). Ein vernünftiges DBMS wird demnach die Erzeugung multipler PKs verhindern - MySQL ist ein solches System. Folgerichtig findet sich in dessen Doku auch der Satz: "A table can have only one PRIMARY KEY." http://www.mysql.com/doc/en/CREATE_TABLE.html.
Dies geht ja zum Glück noch.
Naja...
Im nächsten Schritt allerdings sollen entsprechend zu den Keys auch Constraints definiert werden.
Bevor Du im Nussknacker als Primaballerina den Arabischen Tanz aufführst, solltest Du Dir zunächst die Befähigung zum aufrechten Gang aneignen! Danach kannst Du weitersehen... Nähere Informationen zur hohen Kunst des klassischen Ballets findest Du dann hier: http://www.mysql.com/doc/en/InnoDB_foreign_key_constraints.html.
HTH Robert
hast da ein wirkliches Problem mit der Theorie relationaler DB-Systeme. Per Definitionem kann eine Tabelle nur einen Primärschlüssel besitzen (oder keinen). Ein vernünftiges DBMS wird demnach die Erzeugung multipler PKs verhindern - MySQL ist ein solches System. Folgerichtig findet sich in dessen Doku auch der Satz: "A table can have only one PRIMARY KEY." http://www.mysql.com/doc/en/CREATE_TABLE.html.
Erst mal vielen Dank Robert, bevor Du Dich allerdings über jemanden lustig machst, könntest Du mal nachfragen warum das Problem eigentlich entsteht. Der SQL-Code der von mir gepostet wurde, entstand aus einem CASE-Tool. Die beiden Tabellen "Lehrveranstaltung" und "Buch" wurden über die Tabelle "empfiehlt" miteinander verknüpft. Diese enthält dann leider die Variablen "ISBN" und "LV_Nr" als Primary Key. Der Skript entsteht dann nach generieren zu Standard-SQL. Falls du dennoch konstruktive Vorschläge hast würde ich mich sehr freuen. Die Dokumentationen die Du mir empfiehlst habe ich auch schon durch gelesen bevor ich die Anfrage hier ins Forum gepostet habe.
MfG
Hi SSchrickel,
bevor Du Dich allerdings über jemanden lustig machst, könntest Du mal nachfragen warum das Problem eigentlich entsteht.
das Problem, daß Du in einer Tabelle zwei Primary Keys haben willst, entsteht dadurch, daß Du Dich anscheinend nicht hinreichend mit dem Wesen von Tabellen und der Funktion von Primary Keys in gängigen RDBMS beschäftigt hast - so verstehe ich jedenfalls das Posting von "srob".
Viele Grüße
Michael
Habe das ganze mal mit Interbase ausprobiert, da geht es komischer Weise. Die Skripte sind übrigens in ANlehnung an Vorlesungsinhalte eines Informatikstudiums. Möchte an der Stelle auch auf eine Internetseite verweisen, auf der ebenfalls die Verknüpfung zweier Tabellen eingegangen wird, www-ab.informatik.uni-tuebingen.de/teaching/ss03/asa/db_intro.pdf;
Der für Interbase generierte Code lautet:
CREATE TABLE EMPFEHLUNG (
L_NR INTEGER NOT NULL REFERENCES LEHRE,
ISBN INTEGER NOT NULL REFERENCES BUCH,
PRIMARY KEY (L_NR, ISBN));
Gibt es eine derartige Lösung auch für MYSQL?
Hallo,
bevor Du Dich allerdings über jemanden lustig machst, könntest Du mal nachfragen warum das Problem eigentlich entsteht.
es tut mir leid, wenn der Eindruck entsteht, als würde ich mich über Dich lustig machen. Meine Intension war allenfalls, einen Anklang von Ironie (nein, keine Berlusconi-Ironie!) in die Antwort zu legen. Das kam wohl aus dem verstörten Eindruck, den Dein Posting bei mir hervorrief - kann jemand, der sich mit fortgeschrittenen Fragen wie der Einrichtung von Contraints beschäftigt, so ahnungslos sein bei den PKs? Im Nachhinein betrachtet, war das noch nicht einmal ein Anklang von Ironie. Die Metapher paßt einfach: jemand, der noch nicht richtig gehen kann, fragt nach einer schwierigen Balletfigur. Anders kann ich mir die Hintergründe Deiner Frage nicht erklären...
Der SQL-Code der von mir gepostet wurde, entstand aus einem CASE-Tool.
Auch wenn Dir das wiederum nicht weiterhilft: niemand, der relationale DB-System nicht grundlegend verstanden hat und SQL _beherrscht_, sollte an CASE-Tools herangelassen werden. Das gilt gleichermaßen für Entwurfswerkzeuge und Generatoren anderer Bereiche (HTML-Generatoren, Access, der ganze VB-Mist, der mit der Maus zusammengeklickt wird, etc.) Das Ergebnis ist immer so, wie es jetzt bei Dir zu sein scheint: irgendetwas Generiertes funktioniert irgendwie, aber Du bist nicht in der Lage, einzugreifen, zu verstehen, den Überblick zu behalten, _sicher_ zu sein. Keine Kontrolle, keine Ahnung. Nach meiner Überzeugung ist ein Großteil an all der miserablen, fehleranfälligen, kaum wart- und erweiterbaren Software in dieser Welt genau auf diesen inkompetenten Einsatz derartiger Systeme zurückzuführen.
Da kommt mir der Gedanke von den Töpferlehrlingen im alten Japan, die in den ersten drei Jahren ihrer Ausbildung nichts anderes tun durften, als den Ton für ihre Meister vorzubereiten. Kannst Du Dir vorstellen, daß jemand, der einen solchen Weg geht, nach langer Reifezeit ein echter Meister in seinem Fach sein kann? Und nur dann? Aber jetzt muß ich aufpassen, daß ich mich als jemand, der in Sachen Philosophie noch nicht einmal laufen kann, nicht mit Nurejewschen Sprungfiguren befasse...
Ich muß noch packen, um heute nacht nach Paris zu abzureisen, habe schon genug Zeit vergeudet (meine Frau fragt mich eben, ob ich noch ganz dicht bin, mich jetzt noch mit diesem Nerdkram zu beschäftigen - recht hat sie!). Du wirst das schon lösen; ich wünsche Dir einen demutsvollen Lehrweg zur Meisterschaft in taoistischer Gelassenheit!
HTH Robert
@ Michael Schröpl: ja, genau!
Hallo an SRob,
Schönen Urlaub erstmal.
Per Definitionem kann eine Tabelle nur einen Primärschlüssel besitzen (oder keinen). Ein vernünftiges DBMS wird demnach die Erzeugung multipler PKs verhindern - MySQL ist ein solches System. Folgerichtig findet sich in dessen Doku auch der Satz: "A table can have only one PRIMARY KEY." http://www.mysql.com/doc/en/CREATE_TABLE.html.
Bevor Du im Nussknacker als Primaballerina den Arabischen Tanz aufführst, solltest Du Dir zunächst die Befähigung zum aufrechten Gang aneignen! Danach kannst Du weitersehen... Nähere Informationen zur hohen Kunst des klassischen Ballets findest Du dann hier: http://www.mysql.com/doc/en/InnoDB_foreign_key_constraints.html.
Vielleicht solltest du dieses Posting nochmal überarbeiten, weil
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)) TYPE=INNODB;
steht in der von Dir erwähnten Quelle. Auch wenn ich Deiner Meinung nach RDBMS nicht fähig bin, zählen und lesen kann ich dann doch. Flls ich mich an der Stelle nicht verlesen und verzählt haben sollte, werden da auch gerade in einer Tabelle zwei Primary Keys gebildet. Wer von uns beiden will denn dann nun ohne aufrechten Gang eine Primaballerina vom besten geben.
Viele Grüße an die leider durch mich genervte Frau!
MfG
SSchrickel
Hallo SSchrickel,
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)) TYPE=INNODB;Flls ich mich an der Stelle nicht verlesen und verzählt haben sollte, werden da auch gerade in einer Tabelle zwei Primary Keys gebildet.
Nein. Es wird _ein_ Primary Key bestehend aus zwei Feldern gebildet.
Grüße
Andreas