Abbiamo una tabella con un vincolo univoco su di esso, per feedback lasciato da un utente, per un altro, in relazione a una vendita.Vincolo univoco con righe cancellate escluse
ALTER TABLE feedback
ADD CONSTRAINT unique_user_subject_and_sale
UNIQUE (user_id, subject_id, sale_id)
Ciò garantisce che non si verifichino accidentalmente righe di feedback duplicate.
Attualmente a volte cancelliamo il feedback lasciato in errore e l'utente ha lasciato di nuovo. Vogliamo cambiare a soft-delete:
ALTER TABLE feedback
ADD COLUMN deleted_at timestamptz
Se deleted_at IS NOT NULL
, prendere in considerazione le valutazioni cancellato, anche se abbiamo ancora la pista di controllo nel nostro DB (e probabilmente mostrarlo fantasma fuori per gli amministratori del sito).
Come possiamo mantenere il nostro vincolo univoco quando stiamo usando soft-delete come questo? È possibile senza utilizzare un vincolo più generale CHECK()
che esegue un controllo di aggregazione (non ho mai provato a utilizzare il controllo di vincolo come questo).
È come se fosse necessario aggiungere una clausola WHERE al vincolo.
Non ho inserito lo schema completo, ma il feedback ha una chiave primaria (seriale) intera. Inoltre, user_id, sale_id e subject_id sono dichiarati come chiavi esterne (e hanno indici). Abbiamo solo bisogno di rafforzare l'unicità come un ulteriore vincolo. – d11wtq
E sì, va bene per l'indice univoco per consentire le righe che differiscono solo nel timestamp deleted_at ... questa è la cosa che stavo cercando di raggiungere;) – d11wtq
Se si dispone di una chiave primaria seriale eb) una parziale indice come hai descritto e come ho provato, hai ancora un potenziale problema con altre tabelle che fanno riferimento al "feedback". Supponiamo che le tre righe che ho postato nell'esempio precedente abbiano le chiavi primarie seriali 1, 2 e 3. Quale di queste fa scegliere una tabella di riferimento per la sua chiave esterna? In che modo tutte le tabelle di riferimento sapranno selezionare lo * stesso * valore? –