2011-06-12 14 views
5

Tengo 3 tablas. Una tabla base, llámala Tabla A, y dos tablas que hacen referencia a la Tabla A, llámalas Tabla X y Tabla Y. Tanto X como Y tienen una restricción de clave externa que hace referencia a la Tabla A. La Clave externa de X e Y también es suya Clave primaria.Una restricción que solo permite que una de dos tablas haga referencia a una tabla base

Me gustaría saber si es posible agregar una restricción que solo permita que una de estas tablas contenga una repetición que haga referencia a la Tabla A. Entonces, si X tiene un registro que hace referencia a A, Y no puede tener uno y si Y tiene un registro que hace referencia a A, entonces X no puede tener uno.

¿Esto es posible?

Gracias,

+0

Me gustaría tener curiosidad acerca de su caso de uso. Hay algo __interesting__ sobre su estructura. Tiene 3 claves principales que usan el mismo valor de clave. – NullRef

+0

Sí, son tres tablas para almacenar cuentas de usuario. Hay dos tipos de cuenta. Entonces, hay una tabla base que contiene información que es común para ambos tipos de cuenta y luego una tabla para cada tipo de cuenta que contiene información específica para ese tipo de cuenta. Entonces el PK para cada tabla es el ID de usuario porque pensé que esto haría las cosas coherentes y facilitaría el acceso a un registro por UserID. –

Respuesta

7

CHECK restricciones con UDF (que es la respuesta de Oded) no escalan bien y tienen poca concurrencia. Vea éstas:

Así:

  • crear una nueva tabla, digamos TableA2XY
  • esto tiene el PK de la Tabla A y un char (1) columna con un CHECK para permitir ony X o Y. Y una restricción única en el PK de A también.
  • Tablex y Tabley tienen nueva columna char (1) con un cheque para permitir que sólo X o Y respectivamente
  • Tablex y Tabley tienen su FK a TableA2XY en ambas columnas

Este es el enfoque superclave o subtipo

  • todo DRI basado
  • no activa
  • no udfs con acceso a la tabla de restricciones CHECK.
+0

Estoy haciendo prácticamente lo mismo que describió. Recientemente cambié a agregar una columna CHAR (1) computada persistente en mi tabla secundaria, para que no aparezca en las listas de columnas generadas automáticamente por SQL Prompt –

1

Sí, esto es posible utilizando CHECK constraints.

Además de la restricción de clave foránea normal, deberá agregar un CHECK constraint en ambas tablas de referencia para asegurarse de que no se utiliza una clave externa en la otra tabla de referencia.

+0

El CHECK necesita un udf escalar que no es seguro y lento. Ver mi respuesta por favor. – gbn

Cuestiones relacionadas