SQL zusammengesetzten Primärschlüssel referenzieren / unique für mehrere Attribute

T

Tersus

Gast
Guten Abend,

ich habe eine Tabelle A mit einem zusammengesetzten Primärschlüssel.
Nun möchte ich in meiner Tabelle B die Tabelle A referenzieren.
Kann ich dies über einen einzelnen Fremdschlüssel tätigen?

Ich vermute nicht und führe meine Idee weiter aus.
Ich nutze einfach einen künstlichen Primärschlüssel für Tabelle A und referenziere diesen durch einen Fremdschlüssel in meiner Tabelle B.

Nun ergibt sich ein Problem.
Durch den künstlichen Primärschlüssel in Tabelle A, kann es passieren, dass die Integrität verletzt wird, weil die ursprünglichen Schlüsselattribute keine mehr sind.
Konkret:

Code:
TabelleA(_a_, _b_, c, d)
künstlicher Schlüssel eingefügt:
TabelleA(_k_, a, b, c, d)

Nun könnte es mehrere Zeilen in Tabelle A geben, in denen die Attribute a und b als Paar wiederholt auftreten, was nicht sein darf.

Wie löse ich das Problem?

Kann ich die Attribute a und b gemeinsam als unique kennzeichnen oder ist das automatisch immer der Fall?
 
Also entweder verstehe ich dein Problem nicht oder die Antwort ist einfach:


Ein Primärschlüssel ist IMMER unique, dass brauchst du nicht zu definieren. Es wäre reichlich sinnlos würde ein Primärschlüssel doppelt vorkommen.

Wenn du einen künstlichen pkey einfügst (was auch durch laufende Nummern getan wird) ist dieser natürlich auch unique.

Ich vermute das ich deine Frage nicht komplett Verstehe..könntest du vll ein minimalbeispiel erstellen also Tabelle 1 und 2 mit Daten füllen.
 
Zuletzt bearbeitet:
Es geht nicht um den Primärschlüssel, sondern um Attribute, die keine Primärschlüssel (mehr) sind.

Zuerst das Trivial-Beispiel

Code:
Lager
|--------------+-------------+--------------|
| Lagernr. (P) | Fachnr. (P) | Gegenstand   |
|--------------+-------------+--------------|
| 1            | 1           | Zange        |
| 1            | 2           | Bohrer       |
| 2            | 1           | Schraubstock |
| 1            | 3           | Zange        |
|--------------+-------------+--------------|

LNr. und FNr. sind der zusammengesetzte Primärschlüssel. Von beiden ist der Gegenstand funktional abhängig.
Nun möchte ich aber keine zwei Primärschlüssel haben, sondern nur einen.
Also erzeuge ich einen künstlichen Primärschlüssel (ID) und mache LNr. und FNr. von diesem künstlichen Schlüssel funktional abhängig. Der Gegenstand ist damit transitiv abhängig von der ID.

Die neue (problematische) Tabelle schaut so aus:

Code:
            should be unique
          /                  \
|--------+----------+---------+--------------|
| ID (P) | Lagernr. | Fachnr. | Gegenstand   |
|--------+----------+---------+--------------|
| 1      | 1        | 1       | Zange        |
| 2      | 1        | 2       | Bohrer       |
| 3      | 2        | 1       | Schraubstock |
| 4      | 1        | 3       | Zange        |
| 5      | 1        | 1       | Hammer       | <-- sollte durch die Integritätsprüfung fallen
|--------+----------+---------+--------------|

Die markierte Zeile ist nun ärgerlicherweise möglich, da LNr. und FNr. keine Primärschlüssel mehr sind.
Tatsächlich möchte ich aber sicherstellen, dass dies nicht möglich ist.
Also die Kombination aus LNr. und FNr. soll weiterhin eindeutig sein.

Wie gebe ich diese beiden Attribute dem DBMS nun gemeinsam Eindeutigkeit bekannt?
 
Nur ganz kurz da gerade wenig Zeit:

Versuch mal:

Alter table add contraint unique (a,b)


Falls das nicht geht nochmal melden
 
Zuletzt bearbeitet:
kann sein, dass ichs grad etwas falsch verstanden habe (da ich auch gerade im code stecke), aber du kannst durchaus FKs (foreign keys) auf mehrere PKs (primary keys) legen. In dem Fall würd das in etwa so aussehen:

ALTER TABLE tab1_tabelle1
ADD CONSTRAINT fk_Tab1Tab2_Key1Key2
FOREIGN KEY (tab1_key1, tab2_key2)
REFERENCES tab2_tabelle2(tab2_key1, tab2_key2)
ON DELETE NO ACTION
ON UPDATE CASCADE
 
Zurück
Oben