Restricción de SQL que un valor de columna no puede ser mayor que otro en una tabla diferente

Esta probablemente no es una pregunta muy buena ya que combina la lógica de negocios con la estructura de DB, pero no es mi decisión, así que:

¿Es posible definir una restricción que infiere el valor de una columna (Tabla A, Columna X) no puede ser mayor que el valor de otra (Tabla B, Columna Y) a la que se hace reference mediante una key externa?

TABLE_A ID (Primary Key) X (int value) TABLE_B A_ID (Foreign Key to TABLE_A) Y (int value) 

es decir, quiero aplicar eso para todos los valores de Y, Y <L donde L es un valor de X donde TABLE_B.A_ID == TABLE_A.ID

Estoy trabajando con DB2.

¿Es posible definir una restricción que infiere el valor de una columna (Tabla A, Columna X) no puede ser mayor que el valor de otra (Tabla B, Columna Y) a la que se hace reference mediante una key externa?

No. Eso requeriría usar una instrucción SELECT dentro de una restricción CHECK, y DB2 no la admite. Si admitiera usar una instrucción SELECT de esa manera, se vería algo así.

 ALTER TABLE_B ADD CONSTRAINT TABLE_B_Y_LT_L CHECK (Y < (SELECT X FROM TABLE_A WHERE TABLE_A.ID = TABLE_B.A_ID)); 

La instrucción SELECT devolverá un valor único, porque TABLE_A.ID es único. Pero, como dije, DB2 no admite sentencias SELECT en restricciones de verificación. No creo que ningún dbms actual lo haga.

Soluciones provisionales

Hay un par de soluciones. Primero, podrías escribir un disparador. En segundo lugar, puede almacenar la columna "X" en ambas tablas y usar una restricción de key externa y una restricción de verificación para implementar su requerimiento.

 -- Since "id" is unique, the combination of "id" and "x" is also unique. -- Declaring "unique (id, x)" lets these two columns be the target of a -- foreign key reference. -- create table table_a ( id integer primary key, x integer not null, unique (id, x) ); -- The foreign key references both columns in "table_a". The check constraint -- indirectly guarantees that y < table_a.x. -- create table table_b ( a_id integer not null, a_x integer not null, y integer not null, primary key (a_id, a_x, y), foreign key (a_id, a_x) references table_a (id, x), check (y < a_x) ); 

Esto es SQL estándar. Debería funcionar en cualquier SQL dbms actual.

    Intereting Posts