web-dev-qa-db-fra.com

Requêtes SQL sous contrainte de vérification

Puis-je faire des sous-requêtes SQL dans la contrainte de vérification?

J'ai une table post avec des colonnes id, owner
J'ai une autre table action avec des colonnes user_id, post_id
Tableau user avec colonnes id

post_id -> post.id Et user_id -> user.id Également post.owner -> user.id

Maintenant, je veux contraindre post(post_id).id != user_id sur la table action

Comment est-ce possible ?

43
Dipro Sen

Il n'est pas pris en charge de regarder au-delà de la ligne actuelle dans une contrainte CHECK.

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

Une contrainte de vérification spécifiée en tant que contrainte de colonne doit référencer uniquement la valeur de cette colonne, tandis qu'une expression apparaissant dans une contrainte de table peut référencer plusieurs colonnes.

Actuellement, les expressions CHECK ne peuvent pas contenir de sous-requêtes ni faire référence à des variables autres que les colonnes de la ligne actuelle.

Il y a de bonnes raisons à cette restriction, mais si vous aimez jongler avec des torches enflammées tout en conduisant un monocycle dans un trafic intense, vous pouvez inverser la restriction à l'aide de fonctions. Les situations dans lesquelles cela ne reviendra pas pour vous mordre sont rares; vous seriez beaucoup plus sûr d'appliquer l'invariant dans le code de déclenchement à la place.

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

68
kgrittn