Wir haben eine Tabelle mit einer eindeutigen Einschränkung für Feedback von einem Benutzer, für einen anderen, in Bezug auf einen Verkauf.Eindeutige Einschränkung mit weichen gelöschten Zeilen ausgeschlossen
ALTER TABLE feedback
ADD CONSTRAINT unique_user_subject_and_sale
UNIQUE (user_id, subject_id, sale_id)
Dies stellt sicher, dass wir nicht versehentlich doppelte Zeilen von Feedback erhalten.
Zur Zeit löschen wir manchmal hart Feedback löschen links und lassen Sie den Benutzer verlassen es erneut. Wir wollen Soft löschen ändern:
ALTER TABLE feedback
ADD COLUMN deleted_at timestamptz
Wenn deleted_at IS NOT NULL
, betrachten das Feedback gelöscht, wenn wir noch den Audit-Trail in unserer DB (und wahrscheinlich teilen Sie Ihre Website-Administratoren geister out).
Wie können wir unsere einzigartige Einschränkung beibehalten, wenn wir so ein Soft-Delete verwenden? Ist es möglich, ohne eine allgemeinere CHECK()
Einschränkung zu verwenden, die eine Aggregatprüfung durchführt (ich habe nie versucht, Prüfbeschränkung wie dieses zu verwenden).
Es ist wie ich eine WHERE-Klausel an die Einschränkung anfügen müssen.
Ich habe das vollständige Schema nicht veröffentlicht, aber Feedback hat einen ganzzahligen (seriellen) Primärschlüssel. Darüber hinaus werden user_id, sale_id und subject_id als Fremdschlüssel deklariert (und haben Indizes). Wir müssen nur die Eindeutigkeit als zusätzliche Einschränkung durchsetzen. – d11wtq
Und ja, es ist in Ordnung für den eindeutigen Index, Zeilen zu erlauben, die sich nur im deleted_at-Zeitstempel unterscheiden ... das ist die Sache, die ich erreichen wollte;) – d11wtq
Wenn Sie a) einen seriellen Primärschlüssel und b) einen partiellen haben Index wie beschrieben und wie ich getestet habe, haben Sie immer noch ein potentielles Problem mit anderen Tabellen, die auf "Feedback" verweisen. Angenommen, die drei Zeilen, die ich im obigen Beispiel gepostet habe, haben die seriellen Primärschlüssel 1, 2 und 3. Welchen von diesen wählt eine referenzierende Tabelle für ihren Fremdschlüssel? Wie können alle referenzierenden Tabellen den * gleichen * Wert auswählen? –