2011-03-01 16 views
10

estoy tratando de actualizar los campos de tres mesas diferentes, pero me estoy haciendo algunos errores:¿Cómo actualizar varias tablas al mismo tiempo?

UPDATE 
    a, b, c 
SET 
    a.Locked = 0, 
    b.Locked = 0, 
    c.Locked = 0, 
    a.LockedByUsername = 'zolomon', 
    b.LockedByUsername = 'zolomon', 
    c.LockedByUsername = 'zolomon', 
    a.LockedAt = CURRENT_TIMESTAMP, 
    b.LockedAt = CURRENT_TIMESTAMP, 
    c.LockedAt = CURRENT_TIMESTAMP 
FROM 
    TableA AS a 
    INNER JOIN TableB as b ON n.Objid = o.Objid 
    INNER JOIN TableC as c ON n.Namnid = e.Namnid 
WHERE 
    a.Namn1 = 'FirstName LastName' AND b.objektkod='SomeIdentifier' 

y los errores:

Msg 102, Level 15, State 1, Line 2 
Incorrect syntax near ','. 

Respuesta

21

no puede actualizar los campos de varias tablas en una consulta simple update. Hay error que está recibiendo es porque esto no está permitido:

update a, b, c 

Dado que sólo puede actualizar una tabla por update comando.

+0

Por lo tanto, debería crear una transacción y realizar la misma actualización para las tres tablas diferentes (todos ellos contienen los campos/columnas especificadas) en lugar? – Zolomon

+0

Sí, puede hacerlo, o como 'dnl' sugirió en otra respuesta, puede encapsular sus actualizaciones en un procedimiento almacenado. –

+0

Según mi sugerencia, podría unir las tablas en una vista y actualizar la vista ... – FarligOpptreden

3

no puede actualizar varias tablas en una sola declaración. una opción sería usar un procedimiento almacenado

+1

+1 como la idea de un procedimiento almacenado. Siempre me olvido de que los usuarios de MSSQLServer almacenan los procedimientos. –

4

Como se señala en otras respuestas, en SQL un UPDATE actualiza solo una tabla. Eso es normalmente suficiente para la mayoría de las necesidades prácticas. Si desea actualizar varias tablas al mismo tiempo, puede simplemente poner las actualizaciones dentro de una transacción, y el efecto normalmente será el mismo.

Si usted está preocupado acerca de cómo obtener diferentes marcas de tiempo (para el campo lockedAt) se ven por primera vez en sus documentos de base de datos para comprobar si su función CURRENT_TIMESTAMP se refiere a la hora de inicio de la transacción (por ejemplo PostgreSQL).

0

Podemos actualizarlo con unirse como esto

UPDATE table1 
INNER join table2 on table1.id=table2.tab1_id 
INNER join table3 on table1.id=table3.tab1_id 
SET table1.status=1,table2.status=1,table3.status=1,table1.name='Premjith' 
WHERE table1.id=1 
+1

sintaxis relevante para postgres –

Cuestiones relacionadas