2012-03-29 27 views
5

Sé que la pregunta de cómo actualizar varias tablas en SQL se ha preguntado antes y la respuesta común parece ser que las haga por separado en una transacción.Cómo actualizar 2 columnas en 2 tablas que tienen clave externa

Sin embargo, las 2 columnas que necesito actualizar tienen una clave externa, por lo que no se pueden actualizar por separado.

p. Ej.

Table1.a es una clave externa a Table2.a

Una de las entradas en las tablas es incorrecta, por ejemplo, ambas columnas son 'xxx' y deben ser 'aaa'

¿Cómo actualizo Table1.a y Table2.a para que sean 'yyy'?

Sé que podría quitar la llave temporal y reemplazarla, pero seguramente hay otra manera.

Gracias

Respuesta

10

No se puede hacer la actualización al mismo tiempo, sin embargo se puede obligar a SQL para hacer la actualización. Debe asegurarse de que sus claves externas tengan la acción de referencia referencial ON UPDATE CASCADE

p.

ALTER TABLE YourTable 
ADD CONSTRAINT FK_YourForeignKey 
FOREIGN KEY (YourForeignKeyColumn) 
REFERENCES YourPrimaryTable (YourPrimaryKeyColumn) ON UPDATE CASCADE 
+0

Gracias, eso aclara el hecho de que no puedo. Cascade funciona bien. – Sunrise

+0

+1 de mí también! –

2

mi respuesta se basa en el siguiente enlace: http://msdn.microsoft.com/en-us/library/ms174123%28v=SQL.90%29.aspx

Es necesario asegurarse de que su table_constraint se define como ON UPDATE CASCADE

  CREATE TABLE works_on1 
     (emp_no INTEGER NOT NULL, 
      project_no CHAR(4) NOT NULL, 
      job CHAR (15) NULL, 
      enter_date DATETIME NULL, 
      CONSTRAINT prim_works1 PRIMARY KEY(emp_no, project_no), 
      CONSTRAINT foreign1_works1 FOREIGN KEY(emp_no) REFERENCES employee(emp_no) ON DELETE CASCADE, 
      CONSTRAINT foreign2_works1 FOREIGN KEY(project_no) REFERENCES project(project_no) ON UPDATE CASCADE) 

y luego cuando se va a cambiar el valor de su clave principal

consulte la siguiente cita:

Para ON DELETE o ON UPDATE, si se especifica la opción CASCADE, la fila se actualiza en la tabla de referencia si la fila de referencia correspondiente se actualiza en la tabla primaria. Si no se especificó NO ACTION en , SQL Server Compact Edition devuelve un error y la acción de actualización en la fila a la que se hace referencia en la tabla principal se revierte.

Por ejemplo, puede tener dos tablas, A y B, en una base de datos. La tabla A tiene una relación referencial con la tabla B: la clave A.ItemID foreign hace referencia a la clave primaria B.ItemID.

Si se ejecuta una instrucción UPDATE en una fila en la tabla B y una acción ON CASCADE ACTUALIZACIÓN se especifica para A.ItemID, SQL Server Compact Edition comprueba para una o más filas dependientes de la tabla A. Si existe cualquier , las filas dependientes de la tabla a se actualizan, como es la fila referenciado en la tabla B.

Alternativamente, si no se especifica ninguna acción, SQL Server Compact Edition devuelve un error y revierte la acción de actualización en la que se hace referencia fila en la tabla B cuando hay al menos una fila en la tabla A que lo referencia .

+0

Gracias, la actualización funciona en cascada. – Sunrise

2

No me gusta la actualización de cascada, sugeriría una ruta diferente.

Primero no actualiza la tabla Parent, agrega un nuevo registro con el valor que desea (y los mismos datos que el otro registro para todos los demás campos). Entonces no tiene dificultades para actualizar las tablas secundarias para usar este valor en lugar de ese valor. Además, ahora tiene la capacidad de hacer el trabajo en lotes para evitar bloquear el sistema mientras el cambio se promulga a través de él. Una vez que todas las tablas secundarias se hayan actualizado, puede eliminar el registro incorrecto original.

+0

Gracias por su respuesta, que suena bien, excepto que necesito mantener los mismos campos de identidad y también hay índices únicos en otras 4 columnas que restringirían la duplicación requerida para su método. – Sunrise

Cuestiones relacionadas