31

È possibile creare sottocategorie SQL in Controllo vincolo?Sottocompetizioni SQL con vincolo di controllo

Ho una tabella con le colonne postid, owner
Ho un altro tavolo action con colonne user_id, post_id
Tavolo user con colonne id

post_id -> post.id e user_id -> user.id anche post.owner -> user.id

Ora voglio vincolo post(post_id).id != user_id sul tavolo action

Com'è possibile?

+0

perché dovrebbe importa se una colonna che fa riferimento a una tabella accade di avere un valore * * che è presente in un altro tavolo? Qual è il problema che stai cercando di risolvere? – SingleNegationElimination

risposta

51

Non è supportato guardare oltre la riga corrente in un vincolo CHECK.

http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html dice:

Un vincolo di controllo specificato come vincolo di colonna deve fare riferimento solo valore della colonna, mentre l'espressione che appare in un vincolo di tabella può fare riferimento a più colonne.

Attualmente, le espressioni CHECK non possono contenere subquery né fare riferimento alle variabili diverse dalle colonne della riga corrente.

Ci sono buone ragioni per questa restrizione, ma se ti piace destreggiarti con le torce infuocate mentre monti un monociclo attraverso il traffico intenso, puoi sovvertire la restrizione usando le funzioni. Le situazioni in cui questo sarà non tornare a morderti sei raro; saresti molto più sicuro applicare l'invariante nel codice di attivazione.

http://www.postgresql.org/docs/9.1/interactive/triggers.html

+19

+1 per "manipolare le torce infuocate mentre si guida un monociclo attraverso il traffico pesante" :-) –

+4

Per [commento di Tom Lane] (http://www.postgresql.org/message-id/[email protected] non è consigliato hackerare la limitazione delle subquery: _ "CHECK è pensato per gestire i vincoli sul valore di una riga ** in isolamento **. Se si tenta di utilizzarlo per far rispettare le condizioni delle righe incrociate, il progetto finirà sicuramente male. _ – Shane

+2

Sì, questo è vero: "CHECK è pensato per gestire i vincoli sul valore di una riga in isolamento." ... Ma: cos'è un vincolo univoco? È "destreggiarsi tra le torce fiammeggianti mentre si guida un monociclo attraverso il traffico pesante"? Ho già provato entrambe le torce fiammeggianti e un monociclo, fino ad ora non riesco a fare entrambe le cose, ma forse in futuro. – guettli

Problemi correlati