2009-09-04 26 views
19

Necesito actualizar la clave principal para un registro, pero también es la clave externa en otras dos tablas. Y también necesito que la clave principal actualizada se refleje en las tablas secundarias.Clave principal de actualización del Servidor SQL que también es una clave externa en dos tablas

Aquí es mi consulta y el error:

begin tran 
update question set questionparent = 10000, questionid= 10005 where questionid = 11000;
Error 9/4/2009 10:04:49 AM 0:00:00.000 SQL Server Database Error: The UPDATE statement conflicted with the REFERENCE constraint "FK_GoalRequirement_Question". The conflict occurred in database "numgmttest", table "dbo.GoalRequirement", column 'QuestionID'. 14 0 

No recuerdo cómo ir haciendo esto así que por eso estoy aquí. ¿Alguna ayuda?

+0

Otra opción: evitar tener una clave principal modificable. Use una IDENTIDAD como la clave principal en su lugar. Mantenga una restricción única en las columnas que deben ser únicas. Eso puede estar fuera de tu control, pero funciona muy bien para nosotros. Nuestros usuarios pueden cambiar la ID tanto como quieran, y no afecta la clave principal real. –

Respuesta

16

Usted puede:

  1. deshabilitar la aplicación de restricciones FK temporalmente (véase here o here)
  2. actualización de su PK actualización
  3. sus FKs
  4. permitan volver hacer cumplir las restricciones FK

hazlo todo dentro de una transacción y asegúrate de que si la transacción falla, la reinicies correctamente y sigas imponiendo las restricciones FK.

Pero ... ¿por qué necesita cambiar un PK? Espero que esta sea una acción que se ejecuta raramente (importación de datos heredados o algo así).

33

Son sus relaciones usando

ON UPDATE CASCADE 

Si están cambiando a continuación, la tecla de la tabla principal actualizará las claves externas.

p. Ej.

ALTER TABLE Books 
ADD CONSTRAINT fk_author 
FOREIGN KEY (AuthorID) 
REFERENCES Authors (AuthorID) ON UPDATE CASCADE 
+0

¿Alguna manera de decir sin mirar el guión? No tengo los permisos para mirarlo. – NMan

+2

sure: 'BEGIN TRANSACTION; ELIMINAR FROM ParentTable WHERE ID =?; ROLLBACK; ' si ve la violación FK, entonces la actualización de FK está restringida. – van

+0

Esta debería ser la respuesta aceptada. Siento que aborda más de cerca la pregunta del OP y lo hace de una manera mejor que la respuesta actualmente aceptada. –

1

ir a relaciones clave extranjeras de cada una de las tablas secundarias y en la especificación Insertar y actualizar, cambiar las reglas de eliminación y actualización en cascada. esto puede ayudar u poco

+0

No sé por qué esto se revocó: esto hace exactamente lo mismo que la respuesta con los votos más altos, ¡solo en la interfaz de usuario y no en SQL! –

6

Si desea establecer la regla Cascade gráficamente a continuación, el conjunto de reglas en cascada en SQL Management Studio

  1. tabla abierta en el modo de diseño
  2. botón Click Relación de barra de herramientas superior
  3. Seleccionar las relaciones FK requeridos (uno por uno)
  4. lado derecho - Ampliar INSERT o UPDATE Especificación
  5. cambio a la regla de actualización - Cascade

¡Cerrar y guardar, listo!

(Probado en SQL 2008)

+1

¡¡ERES EL HOMBRE !!! –

4

Como no estoy muy seguro de desactivación de restricciones FK, prefiero también:

  1. duplicar la fila con el antiguo PK con uno con el nuevo PK
  2. Actualizar los FKs
  3. eliminar la fila con el antiguo PK

Ventaja: No hay restricción violado dur ing el proceso.

Cuestiones relacionadas