SQL - Zusammengesetzter Primary-Key > nur mit bestimmten Wert UNIQUE?

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.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

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 .


XentriX5526 
Beitragsersteller
 25.05.2021, 19:32

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.