2010-07-12 20 views

Respuesta

10

En lugar de tener el atributo booleano en la tabla, podría tener otra tabla que contenga una fila y apunte a la fila en la tabla original que considere verdadera.

Cambiar el valor verdadero es una cuestión de actualizar la clave externa en la tabla TrueRow.

+0

Sí. Y sería posible usar una restricción de verificación para asegurar que solo exista una fila (usando la técnica de Celko aquí http://www.sqlmonster.com/Uwe/Forum).aspx/ms-sql-server/3453/How-to-Modify-a-views-SQL-source-from-a-program) –

+0

exactamente lo que escribí en mi comentario, pero no sabemos si es posible rediseñar el SQL-Schema. El problema es definitivamente un problema por diseño. De todos modos esto ya fue discutido ... – Erik

+0

Gracias Gilbert & Erik. Cambiar el esquema es una posibilidad, así que seguiría con este enfoque. – Reddy

1
  1. una columna específica solo puede tomar los valores 'verdadero' o 'falso'.

    Uso de tipos de datos para la columna sea boolean o tiny-int

2 y exactamente sólo una fila debe ser tener el valor 'verdadero'?

usted tiene que escribir una consulta que se actualizan todas las columnas de la fila a excepción falsa que ha ajustado en cierto

+0

de (2), quiero que sea como la restricción (similar a las restricciones de claves únicas, primarias) – Reddy

1

Establecer el tipo de datos de la columna de "booleano"; a continuación, agregue una función desencadenante, que establece que la fila que desea ser siempre sea "verdadera" a verdadera en la actualización.

+0

Gracias trigger es una buena opción, pero ¿no tenemos otras opciones? – Reddy

+0

No lo creo; no puede establecer un bloqueo de columna en una sola fila para evitar actualizaciones. Cualquier tipo de índice UNIQUE tampoco funcionará, ya que todas las demás entradas falsas arrojarían una excepción de clave duplicada. Solo si usa procedimientos almacenados o vistas para cambiar la tabla, puede aplicarla allí. Si la tabla se usa directamente, creo que el disparador es la única opción. Otra solución sería extraer la columna a otra tabla y unir esta tabla a continuación. Pero no puedo verificar esto, porque no sé exactamente lo que estás haciendo. – Erik

2

En MySQL, un índice único ignorará los valores NULL. Entonces hay un truco que puedes usar.

Se podría considerar la adición de un bit columna anulable (que sólo puede tener el valor 1 o 0):

ADD COLUMN `is_default` BIT NULL; 
ADD UNIQUE INDEX `is_default_UNIQUE` (`is_default` ASC); 

En este punto, una fila puede ser 1 (TRUE), e intentar añadir otra fila eso también es cierto, resultará en un error:

1062: Duplicate entry '\x01' for key 'is_default_UNIQUE' 

El único inconveniente es que todas las demás filas deben ser NULL y no pueden ser falsas como que también contaría como un valor único.

Example table data

(Esto realmente no es lo que los índices están destinados a ser utilizados para el embargo)

Cuestiones relacionadas