Pregunta

Quiero ser capaz de seleccionar un ID de grupo y hacer una eliminación en cascada a través de tres mesas que se encuentran en una base de datos MS SQL Server. Las tablas de consulta como la siguiente:

table 1 - GROUP
-------------------------------------------
groupID | description | etc


table 2 - MEMBER
-------------------------------------------
memberID | name | etc


table 3 - MAPPINGTABLE 
-------------------------------------------
mappingID | groupID | memberID

Estoy pensando que ya sé que el ID de grupo, probablemente podría seleccionar del memberID de la tabla de asignación con sede fuera de la ID_grupo y eliminar los de la tabla de miembros, pero por lo general terminan con un error de:

"La instrucción DELETE en conflicto con la restricción de referencia ... [FK restricción en la tabla]".

¿Hay alguien que sea capaz de darme alguna orientación sobre la mejor manera de eliminar de los tres estas tablas al mismo tiempo?

Gracias.

¿Fue útil?

Solución

Está ejecutando en integridad referencial . No se preocupe, RI es su amigo. Tiene el propósito de protegerlo.

En base a su estructura, no se puede eliminar de la Miembro o Grupo tabla si la fila que está intentando eliminar tiene una fila correspondiente en la MappingTable .

Si el sistema para permitir que hagas eso, usted tiene datos huérfanos en el MappingTable sin datos de las tablas miembro o grupo correspondiente. La base de datos está evitando que la supresión de los datos, ya que una restricción de integridad referencial se ha colocado en los datos mediante la restricción de clave externa.

Existen opciones como ON DELETE CASCADE, pero son potencialmente muy mortal y puede causar pérdida masiva de datos. Yo personalmente nunca implemento eliminaciones en cascada.

Se debe quitar primero las filas de la MappingTable y supresión de los datos de las tablas de búsqueda (Miembro del Grupo)

Una vez dicho esto, hay que decir lo siguiente:

  1. Marca (copias de seguridad y asegurarse de que tiene una copia de seguridad válida) de sus datos antes de eliminarlo.
  2. realice otra copia de seguridad de datos de causa, una vez eliminada se ha ido para siempre.
  3. Consulte con el negocio / SME para validar que usted está haciendo lo correcto mediante la eliminación de los datos

Otros consejos

Es necesario trabajar la espalda camino hasta las mesas, así que empieza en la parte inferior y luego borrar de la tabla 3 trabajar de nuevo a la tabla 1.

con el fin de utilizar la una cascada que eliminar debe especificar una regla de supresión en el la clave externa. la opción "ON DELETE CASCADE" es lo que necesita.

ver este ejemplo

CREATE TABLE table_child
(
fieldkeyparent int,
field1 INT,
FOREIGN KEY ([fieldkeyparent]) REFERENCES Table_parent
ON DELETE CASCADE)

comprobar este acoplamiento para SQL Server. restricciones de integridad referencial en cascada

eliminaciones

Cascade se implementan de forma diferente en diferentes servidores SQL. ¿Qué estás usando para el software de servidor?

En Oracle, puede especificar eliminaciones en cascada al crear las tablas de manera que será automáticamente borrado de datos de otras tablas cuando se borra el registro principal. He aquí un ejemplo:

ALTER TABLE MAPPINGTABLE ADD CONSTRAINT FK_GROUPID
    FOREIGN KEY (groupID) REFERENCES GROUP(groupID)
ON DELETE CASCADE
;

Lo más fácil es cuando se está configurando sus claves externas, que las plantes a ON DELETE CASCADE

ALTER TABLE mappingtable ADD CONSTRAINT fk_group_id FOREIGN KEY(groupID) REFERENCES group(groupID) ON DELETE CASCADE

La otra opción es ON UPDATE CASCADE si desea añadirlo, pero no ayudaría aquí.

Lo que esto hace es que lo hace tan cuando se elimina el padre de GROUP se eliminará automáticamente cualquier referencia a ella en la mesa MAPPINGTABLE

Para eliminar parte de los usuarios, así, se tendría que hacer una segunda instrucción de eliminación.

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