Angenommen, ich habe eine Tabelle A mit zwei Spalten: Eine ist eine ID für ThingA
und eine ist eine ID für ThingB
. Der Primärschlüssel ist (ThingA, ThingB)
.
Als nächstes habe ich eine zweite Tabelle, aber diesmal ist sie auf Einträge in Tabellen beschränkt A
, die haben ThingB = 3
. Der Primärschlüssel ist ThingA
, weil ThingB
eine Konstante von 3 ist.
Anfangs hatte ich gedacht, ich könnte einfach:
FOREIGN KEY (ThingA, 3) REFERENCES A(ThingA, ThingB)
Aber ich habe gelernt, dass dies nicht der Fall ist, und ich muss eine Spalte erstellen für ThingB
:
ThingB INT NOT NULL DEFAULT(3) CHECK(ThingB = 3)
Dann,
FOREIGN KEY (ThingA, ThingB) REFERENCES A (ThingA, ThingB)
Gibt es eine Alternative dazu, für die keine zusätzliche Spalte erforderlich ist, oder die DEFAULT + CHECK
? Eine Alternative ist eine persistierte, berechnete Spalte , aber ich hasse diese Idee auch, da es sich im Grunde genommen um einen Cheat handelt und immer noch eine neue Spalte mit physischem Speicher hinzugefügt wird. Obwohl es alleine INT
nicht groß sein wird, gibt es mehrere Millionen Zeilen, die es für mehrere Tabellen benötigen, und ich möchte die zusätzlichen Spalten lieber nicht beibehalten.
Hier ist eine Beispiel-DDL, um die Situation zu veranschaulichen:
CREATE TABLE Test1
(
ThingA INT NOT NULL,
ThingB INT NOT NULL,
PRIMARY KEY (ThingA, ThingB)
);
CREATE TABLE Test2
(
ThingAVal INT NOT NULL,
ThingBVal INT NOT NULL DEFAULT(3) CHECK(ThingBVal = 3),
Val INT NOT NULL,
FOREIGN KEY (ThingAVal, ThingBVal) REFERENCES Test1 (ThingA, ThingB)
);
Und ich habe eine db <> -Fiedel erstellt, die meine (aktuelle) Lösung demonstriert:
Wenn die Antwort "Nein" lautet, werde ich sie akzeptieren, aber ich bin gespannt, ob es noch andere Alternativen gibt.
SMALLINT
On-Prod, ich wünschte nur, es gäbe einen besseren Weg, es zu assoziieren. Ich werde möglicherweise A
ganz los , da ich es eigentlich nicht brauche, und mache einfach die referenzielle Integrität über ThingA
, sodass ich es entfernen kann ThingB
.
UNIQUE
Einschränkung zu verwenden (ThingA, ThingB)
?
TINYINT
, wenn die Anzahl der möglichen Werte vonThingB
klein ist.