398 Stimmen

Erstellen einer eindeutigen Einschränkung mit Nullspalten

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 ähnlich wie diese erstellen:

ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);

Dadurch können jedoch mehrere Zeilen mit demselben (UserId, RecipeId) wenn MenuId IS NULL . Ich möchte erlauben NULL en MenuId um einen Favoriten zu speichern, der kein zugehöriges Menü hat, aber ich möchte nur höchstens eine dieser Zeilen pro Benutzer/Rezeptpaar.

Die Ideen, die ich bis jetzt habe, sind:

  1. Verwenden Sie eine fest kodierte UUID (z. B. alle Nullen) anstelle von null.
    Allerdings, MenuId hat eine FK-Beschränkung für die Menüs der einzelnen Benutzer, so dass ich dann ein spezielles "Null"-Menü für jeden Benutzer erstellen müsste, was sehr mühsam ist.

  2. Prüfen Sie stattdessen mit einem Trigger, ob ein Nulleintrag vorhanden ist.
    Ich halte das für lästig und möchte Auslöser nach Möglichkeit vermeiden. Außerdem traue ich ihnen nicht zu, dass sie garantieren, dass meine Daten nie in einem schlechten Zustand sind.

  3. Vergessen Sie es einfach und prüfen Sie, ob zuvor ein Nulleintrag in der Middleware oder in einer Einfügefunktion vorhanden war, und lassen Sie diese Einschränkung weg.

Ich verwende Postgres 9.0. Gibt es eine Methode, die ich übersehe?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X