Problemático eliminar con el índice de SQL
-
05-09-2019 - |
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: (
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.