SQL Sous-requêtes dans la contrainte de vérification
Puis-je faire des sous-requêtes SQL dans la Vérification de la contrainte ?
J'ai un post
table avec des colonnes id, owner
J'ai une autre table action
avec des colonnes user_id, post_id
Tableau user
avec des colonnes id
post_id -> post.id
et user_id -> user.id
aussi post.owner -> user.id
Maintenant, je veux contrainte post(post_id).id != user_id
sur la table action
Comment est-ce possible ?
- Pourquoi devrait-il si une colonne qui fait référence à une table arrive à avoir une valeur est présente dans une autre table? Quel est le problème que vous essayez de résoudre?
- Donc,IIUC si, par exemple, l'action est upvote, fondamentalement, vous voulez empêcher un utilisateur upvoting leur post ?
Vous devez vous connecter pour publier un commentaire.
Il n'est pas pris en charge à regarder au-delà de la ligne en cours dans une contrainte de VÉRIFICATION.
http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html dit:
Il y a de bonnes raisons de cette restriction, mais si vous aimez jongler avec des torches en feu lors de la conduite d'un monocycle à travers la circulation dense, vous pouvez renverser la restriction à l'aide de fonctions. Les situations dans lesquelles cela pas revenir à vous mordre sont rares; vous serait beaucoup plus sûr d'appliquer l'invariant dans le déclenchement de code à la place.
http://www.postgresql.org/docs/9.1/interactive/triggers.html
CHECK
contrainte". Évidemment, d'autres types de contraintes (c'est à dire,UNIQUE
,PRIMARY KEY
,FOREIGN KEY
,EXCLUDE
) doivent regarder au-delà de la seule ligne.CHECK
contrainte finissent mal, c'est que la contrainte n'est évaluée que pour la ligne modifiée. Ainsi, alors qu'il travaille généralement au début, lorsque l'autre ligne référencée a été modifié d'une manière qui a invalidé la contrainte, qui ne serait pas remarqué.