2011-06-01 41 views
5

tengo 2 tablas (MySQL)actualización por lotes MySQL

  1. data_details
  2. accounts_invoices

Lo ideal sería que cada data_details deben tener un id accounts_invoices. (Data_details tiene una clave externa con la clave primaria de accounts_invoices)

Por alguna razón hay data_details registros donde hay accounts_invoice_id no existe en accounts_invoices mesa

así que traté de actualizar esos data_details registros con un conocido Identificación del accounts_invoice. esto es lo que hice

update data_details 
set account_invoice_id = 1 
where account_invoice_id in (
    select d.id 
    from data_details d left join accounts_invoices a 
    on d.account_invoice_id = a.id 
    where a.id is null  
) 

Sin embargo, un error se produce diciendo

Puede especificar tabla de destino 'data_details' para la actualización en la cláusula FROM (error 1093)

Alguien me puede ayudar, gracias de antemano

aplausos

sameera

+1

Para evitar este problema en el futuro, recomiendo usar InnoDB y restricciones de claves externas. – Znarkus

+0

Hola @Znarkus, gracias por el comentario, básicamente también estoy tratando de agregar una relación de clave externa a esta tabla existente: D (data_details) – sameera207

+0

no probado pero la consulta de mysql: UPDATE data_details SET d1 account_invoice_id = 1 FROM data_details d1 combinación interna data_details d2 = eN d1.account_invoice_id d1.id LEFT JOIN accounts_invoices una de d2.account_invoice_id = a.id DONDE a.id es nulo –

Respuesta

4

Ahora bien, esto podría ser una suposición descabellada, pero creo que el problema es que actualizas la misma tabla que estás consultando. Creo que la solución alternativa es utilizar una tabla temporal, así:

update data_details 
set account_invoice_id = 1 
where account_invoice_id in (
select * from (
    select d.id 
    from data_details d left join accounts_invoices a 
    on d.account_invoice_id = a.id 
    where a.id is null  
) as t 
) 

no lo ha probado, sin embargo, por lo que podría estar equivocado.


ha actualizado la SQL para arreglar mi error que fue visto en los comentarios.

update data_details 
set account_invoice_id = 1 
where id in (
select * from (
    select d.id 
    from data_details d left join accounts_invoices a 
    on d.account_invoice_id = a.id 
    where a.id is null  
) as t 
) 
+0

Hola @Znarkus, esto funciona sin un error, pero nada se está actualizando ... ¿Alguna idea? gracias por la ayuda vivas sameera – sameera207

+0

Trate de extraer las declaraciones 'seleccionar' y ver lo que devuelven – Znarkus

+0

Hola declaración de selección devuelve la id correcta como id .. Por lo tanto, la selección es correcta .... por lo que no se trata simplemente de actualizar los registros .. cualquier ayuda sería apreciada, gracias – sameera207

Cuestiones relacionadas