SQL - Zusammengesetzter Primary-Key > nur mit bestimmten Wert UNIQUE?
Ich bin auf der Suche nach einer Idee um folgendes zu realisieren:
Es gibt 2 Tabellen...
Tabelle1: Artikel
ArtID (PK), ArtName, KatID (FK)
Tabelle2: Artikel_Kategorie
KatID (PK), KatName, Status
In Tabelle1 sind Artikel abgelegt welche die Zuordnung zu einer Artikel-Kategorie auf Tabelle2 besitzen. Die KatID in alphanummerisch mit 3 Stellen (Bsp: HN9).
Wenn diese Kategorie in Tabelle2 irgendwann nicht mehr benötigt wird will ich diese in einer Spalte Status auf "inaktiv" setzen um (wie in dem Falle hier: HN9) nochmal neu vergeben zu können.
Ich möchte quasi einen COMPOSITE PRIMARY KEY erstellen, der aber nur UNIQUE ist, wenn der Status "aktiv" ist.
Jemand eine Idee?
3 Antworten
Nein sowas geht nicht. ein Primary Key muss immer Unique sein, er identifiziert eben eindeutig die Zeile. Du kannst aber natürlich noch ein UNIQUE INDEX zur Abfrage oben drauf setzen. Hier lässt sich sowas wieder rum lösen bei den meisten RDBMS. Je nach RDBMS eben.
Verknüpfen kannst du über die Spalte KatID + status = 'active' dann zwar schnell aber die Datenbank stellt eben keine Konsistenz sicher ala Kategorie gibt es nicht mehr aber Artikel verweisen noch darauf.
Als PK bräuchtest du dann eben entweder eine eigene Sequenz oder ein Datum mit zu KatID und Status bzw. eine Sequenz für den Status. Die FK Funktionalität kannst du natürlich je nach RDBMS dann mit Check Contraints nachprogrammieren.
Die Kategorie nur einmal unique mit active drin zu haben ist kein Problem. Dein Problem ist am Ende, dass der FK der Artikel eben nicht funktionieren kann, denn woher soll er wissen welche er nehmen soll? Den Satz mit active? Gut, dann kannst du ihn aber nicht auf inactive setzen, solange es noch Artikel gibt.
Generell scheint das Problem aber allgemein dein Aufbau zu sein. Warum willst du eine Kategorie inaktiv setzen und anschließend ein Duplikat erzeugen, anstatt die Kategorie wieder aktiv zu setzen? Gibt es zu den Zeitpunkt noch Artikel oder werden die vorher alle gelöscht? Natürlich kannst du auch einfach generische IDs als Schlüssel nehmen, wenn die Artikel sauber über einen Dialog oder ähnliches angelegt werden, bei denen man die Kategorie per Namen auswählt aber die ID weiß.
Dann ist deine eigentliche ID eben eine Nummer und der FK steht auch. Nur müsstest du dann aber sauber die Artikel umziehen, nachdem du eine Kategorie auf inaktiv setzt und anschließend die gleiche Kategorie nochmal neu anlegst.
verstehe ich jetzt nicht wirklich , entweder ist was unique oder nicht , ansonsten brauchst du wohl 2 tabellen .
das bezieht sich doch auf die ganze tabelle , ich würde sagen dein konzept is broken by design .
Macht es vielleicht Sinn eine weitere Spalte in Tabelle2 hinzuzufügen 'inactive_since' und alle Spalten als COMPOSITE KEY zu definieren? ich will halt erreichen, dass nur eine KatID im Status 'active' gleichzeitig gibt... im Status 'inactive' war es die ruhig mehrfach geben.
Beim SQL Server gäbe es das Check Attribut, da wäre so etwas möglich.