2012-01-04 2 views
0

에는 meterreadings이라는 테이블이 있습니다. 한 행에서 다른 행으로 속성 meterreading을 복사해야합니다. 2 meterreadingtype_id 값이 1왜이 MySQL 업데이트가 작동하지 않습니까?

까지 복사 할 수 있도록 내가 meterreadingtype_id 열을 기준으로 meterreading 모든 값을 복사 할, 그래서 기본적으로

id   |  meterreadingdate  |  meterreading  |  meterreadingtype_id | created 
------------------------------------------------------------------------------- 
1    |  2011-10-01        |  0             |  1                   | 2011-10-15 
2    |  2011-10-01        |  500           |  2                   | 2011-10-15 

: 여기

데이터의 샘플입니다 다음과 같아야합니다

데이터가 완료되면 :

id   |  meterreadingdate  |  meterreading  |  meterreadingtype_id | created 
------------------------------------------------------------------------------- 
1    |  2011-10-01        |  500           |  1                   | 2011-10-15 
2    |  2011-10-01        |  500           |  2                   | 2011-10-15 

공지 사항 내가,122 때문에 이상 500 복사 그 도움이된다면 우리는 MySQL의 5 InnoDB의 테이블을 사용하는

update meterreadings mr1 
set meterreading =  
(
    select 
     meterreading  
    from meterreadings 
    where 
     meterreadingtype_id = 2 
     and meterreadingdate = mr1.meterreadingdate 
     and location_id = mr1.location_id 
     and created = mr1.created 
     and asset_id = mr1.asset_id 
) 
where asset_id in (select id from assets where model_id in (select id from models where make_id IN (81, 82))) 
and meterreadingtype_id = 1 

: 59,953,210는 1이고 그 다음은 2

때문에 나는 다음 행에서 값을 가서 내가 사용하고있는 쿼리입니다.

+0

죄송합니다. 게시하는 데 문제가 있습니다. 회사 방화벽이 실제 업데이트 진술을 차단하고 있습니다. – cbmeeks

+0

오류가 발생하거나 0 행이 업데이트 되나요? –

+0

@Michael 편집 해 주셔서 감사합니다. Corp 방화벽이 업데이트 진술을 게시하지 못하도록 차단했습니다. – cbmeeks

답변

1

하위 테이블에서 테이블을 수정하고 동일한 테이블에서 선택할 수 없으므로 쿼리가 실패합니다. , SELECT, INSERT, UPDATE, SET 삭제, 또는 DO :

Subquery Syntax

한 제한 하위 쿼리의 외부 문 중 하나 여야한다는 것입니다 참조하십시오. 또 다른 제한 사항은 현재 테이블을 수정하고 하위 쿼리의 동일한 테이블에서 선택할 수 없다는 것입니다. 이는 DELETE, INSERT, REPLACE, UPDATE 및 (SET 절에서 하위 쿼리를 사용할 수 있으므로) LOAD DATA INFILE과 같은 명령문에 적용됩니다.

내가 가입 당신이 어떤이의 주위에 얻을 수 있다고 생각 속임수 :

UPDATE meterreadings AS tgt 
INNER JOIN (
    SELECT * FROM meterreadings 
    WHERE meterreadingtype_id = 2 
) AS src 
ON tgt.meterreadingdate = src.meterreadingdate 
    AND tgt.location_id = src.location_id 
    AND tgt.created = src.created 
    AND tgt.asset_id = src.asset_id 
SET tgt.meterreading = src.meterreading 

난 더 MySQL의 전문가는 아니지만, 나는 MySQL이 먼저 하위 쿼리를 처리하고 메모리에 결과를 저장하기 때문에이 작품 믿는다 UPDATE 중에 변경되지 않는 임시 테이블. 이것의 부작용은 서브 쿼리의 결과가 클 경우, 당신은 1 톤의 메모리를 씹을 것입니다.

메모리 문제를 해결하는 유일한 방법은 업데이트 대상과 직접 관련이없는 기준을 사용하여 하위 쿼리를 축소하는 것입니다. 예를 들어 야간 프로세스의 일부로 이러한 업데이트를 수행하려는 경우 내부 SELECT는 지난 24 시간 내에 생성 된 행만 반환합니다.

+0

그래, 그게 내가 받고있는거야. 더 좋은 방법이 있습니까? – cbmeeks

+0

@cbmeeks : 업데이트 된 답변보기 –

+0

사실 더 쉬운 방법을 찾았지만 대답을주었습니다.내가 실제로 한 일은 모두 1 세를 삭제 한 다음 2를 1로 변경했습니다. 롤. 똑같은 짓 했니? – cbmeeks

관련 문제