Ich habe eine Tabelle mit diesem Layout:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Ich möchte eine eindeutige Einschränkung erstellen, die dieser ähnelt:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Dies ermöglicht jedoch mehrere Zeilen mit derselben (UserId, RecipeId)
, wenn MenuId IS NULL
. Ich mag , damit NULL
in MenuId
einen Favoriten zu speichern , die kein Menü hat zugeordnet, aber ich will nur höchstens eine dieser Zeilen pro Benutzer / Rezept Paar.
Die Ideen, die ich bisher habe, sind:
Verwenden Sie eine fest codierte UUID (z. B. alle Nullen) anstelle von Null.
HatMenuId
jedoch eine FK-Einschränkung für die Menüs jedes Benutzers, so müsste ich dann für jeden Benutzer ein spezielles "Null" -Menü erstellen, was ein Ärger ist.Überprüfen Sie das Vorhandensein eines Null-Eintrags stattdessen mit einem Trigger.
Ich denke, das ist ein Ärger und ich mag es, Auslöser zu vermeiden, wo immer dies möglich ist. Außerdem vertraue ich ihnen nicht, um sicherzustellen, dass meine Daten niemals in einem schlechten Zustand sind.Vergessen Sie es einfach und überprüfen Sie, ob in der Middleware oder in einer Einfügefunktion ein Null-Eintrag vorhanden ist, und haben Sie diese Einschränkung nicht.
Ich benutze Postgres 9.0.
Gibt es eine Methode, die ich übersehen habe?
UserId
,RecipeId
) zulässig, wennMenuId IS NULL
?