31

¿Puedo hacer subconsultas SQL en la restricción Check?SQL Sub consultas en la restricción de verificación

tengo una tabla con columnas postid, owner
tengo otra tabla con columnas actionuser_id, post_id
Tabla user con columnas id

post_id -> post.id y user_id -> user.id también post.owner -> user.id

Ahora quiero a la restricción post(post_id).id != user_id en la tabla action

¿Cómo es eso posible?

+0

Por qué debería importar si una columna que hace referencia a una tabla pasa a tener un valor * * que está presente en otra mesa? ¿Cuál es el problema que estás tratando de resolver? – SingleNegationElimination

Respuesta

51

No se admite mirar más allá de la fila actual en una restricción CHECK.

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

Una restricción de comprobación especificado como una restricción de columna debe hacer referencia únicamente valor de esa columna, mientras que una expresión que aparece en una restricción de tabla puede hacer referencia a varias columnas.

Actualmente, las expresiones CHECK no pueden contener subconsultas ni hacer referencia a las variables que no sean columnas de la fila actual.

Existen buenas razones para esta restricción, pero si le gusta hacer malabares con antorchas llameantes mientras conduce un monociclo a través del tráfico pesado, puede subvertir la restricción mediante las funciones. Las situaciones en las que esto no vuelven a morder son raras; Sería mucho más seguro hacer cumplir la invariante en el código de activación en su lugar.

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

+19

+1 para "hacer malabares con antorchas llameantes mientras pedalea en un monociclo a través del intenso tráfico" :-) –

+4

Por [comentario de Tom Lane] (http://www.postgresql.org/message-id/[email protected]), no se aconseja piratear la restricción de la subconsulta: _ "CHECK está diseñado para manejar restricciones en el valor de una fila ** en forma aislada **. Si intenta usarlo para aplicar condiciones de cruce de filas, el proyecto terminará mal. _ – Shane

+2

Sí, esto es cierto: "CHECK está destinado a manejar restricciones en el valor de una fila de forma aislada." ... Pero: ¿qué es una restricción única? ¿Es "hacer malabares con antorchas encendidas mientras conduces un monociclo a través del tráfico pesado"? Ya intenté hacer malabares con antorchas llameantes y montar un monociclo. Hasta ahora no puedo hacer ambas cosas a la vez, pero tal vez en el futuro. – guettli

Cuestiones relacionadas