Pregunta

Tengo un poco de tabla:

  • Mesa ASK con idask
  • Preferencias de mesa con idpref, fk_idask, fk_idstructure
  • estructura de la tabla con idstructure

Con toda la restricción entre el id y la fk_id y un índice único en las preferencias de mesa (fk_idask, fk_idstructure).

El problema es cuando tengo dos filas en las preferencias.

`IDPREF`   `FK_IDASK`   `FK_IDSTRUCTURE`  
 1          1            1  
 2          1            2

Si quiero invertir (switch?) La estructura de dos entre las preferencias

`IDPREF`   `FK_IDASK`   `FK_IDSTRUCTURE`  
 1          1            **2**
 2          1            **1**

El índice único entre FK_IDASK y FK_IDSTRUCTURE romper, porque con el primer resultado de la actualización en dos preferencias para pedir la misma con la misma estructura.

Para evitar esto, hago un deleteAndResave función y esto resuelve el problema por el momento.

Pero ahora la llegada de la mesa cita con idassignation y fk_idpref.

Ahora bien, si elimino una preferencia unidos por una cita de la pausa restricción.

Ya encontrar una solución, pero es feo. Hay alguna solución para este problema en su sano juicio?

Gracias por la respuesta!

ps. Lo siento por mi mala Inglés: (

¿Fue útil?

Solución

Usted podría intentar esto:

UPDATE
    PREFERENCES
SET
    FK_IDSTRUCTURE = 3 - FK_IDSTRUCTURE

Ahora, ya que se ejecuta en una sola vez, la "C" (consistencia) en "ácidos" significa que las claves foráneas y singularidad se manejan "durante", pero va a estar bien antes y después.

Puede proxeneta la declaración con las instrucciones CASE para cosas más complejas

UPDATE
    PREFERENCES
SET
    FK_IDSTRUCTURE = CASE FK_IDSTRUCTURE 
        WHEN 2 THEN 1 WHEN 1 THEN 2 ELSE FK_IDSTRUCTURE END

Otros consejos

Yah, invertidas dos estructuras entre el índice de la tabla y se rompen!

De todos modos, supongo que su clave externa está apuntando en la dirección equivocada. Parece que la clave externa es de asignación, y apuntando a las preferencias.

La clave externa debe ser de las preferencias, y asignación REFERENCIA.

Otra opción es considerar la opción CASCADE un ON DELETE en la clave externa. Esto significa que cuando se eliminan las filas de la tabla de referencia, el motor de base de datos elimina automáticamente las filas correspondientes en la tabla de clave externa.

Otra opción frecuente es mantener las filas, pero marcarlos como inactivos. Esto puede hacerse mediante la adición de una columna de "poco activo". Al consultar a filtrar las filas marcadas como inactiva.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top