2016-07-10 10 views
1

Ich habe 3 Tabellen:Ein Fremdschlüssel Referenzierung mehrere eindeutige Schlüssel

class_A

 CREATE TABLE class_a (
     id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
     std_id INT NOT NULL UNIQUE, 
     name varchar(225) NOT NULL) 

class_B

 CREATE TABLE class_b (
     id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
     std_id INT NOT NULL UNIQUE, 
     name varchar(225) NOT NULL) 

sn_number

 CREATE TABLE sn_number (
     id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
     pin INT NOT NULL UNIQUE, 
     serial VARCHAR(255) NOT NULL UNIQUE, 
     std_id INT NULL DEFAULT NULL, 
     FOREIGN KEY(std_id) REFERENCES class_a(std_id) 
     ) 

Wie kann ich verweisen auf eindeutige std_id in class_a und Tabelle als Fremdschlüssel in sn_number Tabelle.

Ich möchte wie etwas erreichen ALTER TABLE sn_number ADD FOREIGN KEY(std_id) REFERENCES class_a(std_id), class_b(std_id)

Ich habe versucht, dies zu tun ALTER TABLE sn_number ADD FOREIGN KEY(std_id) REFERENCES class_a(std_id)

gefolgt von

ALTER TABLE sn_number ADD FOREIGN KEY(std_id) REFERENCES class_b(std_id) auf sn_number Tisch, aber halten sich gegenseitig zu überschreiben.

Ich habe diese: Foreign Key Referencing Multiple Tables und

Composite key as foreign key (sql) Aber ich kann die Lösung des Problems nicht gefunden habe.

+0

Dieses Problem ist ein Hinweis für Sie, dass Sie einen Fehler in Ihrem Datenbankentwurf haben. Eine Klasse ist kein Student. Daher würden Sie eine std_id normalerweise nicht an einer Klassen-Tabelle referenzieren, sondern an einer Schüler-Tabelle.Und Sie sollten darüber nachdenken, warum Sie zwei Klassentabellen haben, da Sie möglicherweise das gleiche Problem bekommen, wenn Sie z. Lehrer oder Räume zu Klassen. Grundsätzlich: Es gibt Klassen. Es gibt Studenten. Es gibt sn_numbers. Haben Sie eine Tabelle für jeden, und verknüpfen Sie sie (wenn Sie möchten, können Sie sie buchstäblich zeichnen und durch Linien verbinden). Wenn Sie eine Spezialisierung benötigen, können Sie sie später hinzufügen. – Solarflare

+0

Danke. Das hat mir sehr geholfen. – Abk

+0

@ Abk Im Gegensatz zu dem Kommentar von @Solarflare und einer anderen Antwort ist Ihr Bedarf an zwei Fremdschlüsseln aus derselben Tabelle und Spaltenliste kein Symptom für schlechtes Design. (Obwohl Ihr Design schlecht ist.) Für das Problem mit Ihrem Code sehen Sie meine Antwort. – philipxy

Antwort

1

Fremdschlüssel muss nur eine Elterntabelle referenzieren. Dies ist sowohl für die SQL-Syntax als auch für die relationale Theorie von grundlegender Bedeutung.

Was Sie tun können, ist eine andere Tabelle classes oder students hinzufügen, die alle std_id enthalten, dann nur die FK es verweisen.

+0

Nein, Sie können so viele Einschränkungen wie Sie wollen deklarieren.Jedoch nur eine pro Einschränkung Name – philipxy

0

Da Sie in Ihren FOREIGN KEY Deklarationen keinen Constraint-Namen explizit angegeben haben, erstellt das DBMS einen Namen aus dem Tabellennamen sn_number. Ihr Problem besteht darin, dass Sie damit jedes Mal implizit denselben Constraint-Namen deklarieren, sodass die alte Information für den Namen verloren geht. Verwenden Sie einfach verschiedene explizite Abhängigkeitsnamen für verschiedene Fälle von Tabelle & Spaltenliste REFERENCES Tabelle & Spaltenliste.

CONSTRAINT fk_sn_number_a FOREIGN KEY(std_id) REFERENCES class_a(std_id) 
CONSTRAINT fk_sn_number_b FOREIGN KEY(std_id) REFERENCES class_b(std_id) 

Erfahren Sie mehr über die Grundlagen von Using FOREIGN KEY Constraints.

PS Wie in einem Kommentar angemerkt, ist dies ein schlechtes Design. Aber im Gegensatz zu dem Kommentar & eine andere Antwort, Ihre Notwendigkeit für zwei Fremdschlüssel aus der gleichen Tabelle & Spaltenliste ist kein Symptom für schlechtes Design. Aber bedenken Sie, dass die Probleme, die Leute normalerweise mit "Fremdschlüssel-Referenzierung mehrerer Tabellen" in fragwürdigen Designs haben, dass sie denken, dass ihre Tabellen wie entworfen einen Fremdschlüssel von einem Ort zu zwei Orten benötigen, wenn sie dies nicht tun. Solch ein Design beinhaltet nicht einmal einen Fremdschlüssel, es beinhaltet nur etwas erinnert an einen Fremdschlüssel.

+0

Entweder Sie oder ich didn Ich hole seine Tische - ich du hat folgendes verstanden: einige Schüler sind in Klasse a, manche in Klasse b, die meisten von ihnen sind in sn_number, also hat er versucht, einen Verweis auf eine vollständige Liste von Schülern als eine Vereinigung von Klassen-Tabellen zu erstellen. So funktioniert SQL nicht, das können Sie nicht mit Fremdschlüsseln tun. Also die Grundidee: Eine Studenten ID bezieht sich auf einen Schülertisch (vielleicht indirekt auf einen Schlüsselkandidaten). Es gibt Gründe, Ihr Konstrukt zu verwenden (also "Hinweis" und nicht "das ist immer falsch"), aber für Anfänger gibt es keine. Dass Sie es technisch tun können, bedeutet nicht, dass es Sinn macht. – Solarflare

+0

Ich habe gerade einen Kommentar zu den verschiedenen Dingen hinzugefügt, die Abk gemeint haben könnte. Re "die meisten von ihnen sind in sn_number" Meinst du nicht alle? Re "Schüler-ID bezieht sich auf eine Schüler-Tabelle" Ich stimme zu, dass sie das sein könnte, wenn sie sn_number als "Schüler-Tabelle" verwenden, aber dann gehen die FKs in die andere Richtung und sn_number muss NICHT NULL sein. Re "macht keinen Sinn" Es macht, wenn nr_number ids Schließfächer für Schüler in Klassen identifizieren. – philipxy

+0

Mein Kommentar war hauptsächlich auf ihn als eine zusätzliche Erklärung gerichtet. Ich bin zu 120% sicher, dass Sie wissen, wie Fremdschlüssel funktionieren, ich könnte wahrscheinlich nach den ersten 8 Wörtern stehen bleiben und Sie hätten gewusst, was ich sagen wollte. Abgesehen von dem "all" - ich meinte eigentlich "am meisten", falls der Hinweis in der von ihm beschriebenen Richtung gemeint war (da sn_number der fehlende Schülertisch sein könnte oder auch nicht). Und ich meinte, es macht "keinen Sinn", alle technisch möglichen Methoden zu verwenden. Er wird für die nächsten 3 Jahre keine doppelten Fremdschlüssel benötigen, und wenn er es tut, bin ich mir ziemlich sicher, dass es auf andere Weise umgesetzt werden könnte. – Solarflare

Verwandte Themen