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 ?
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