2014-04-01 2 views
1

내 행의 열 X에 할당 할 값이 다른 행의 특정 열 X 값보다 크거나 같은 경우에만 MySQL에서 UPDATE를 수행하는 훌륭한 솔루션이 있습니까?) 행?조건부 업데이트 new_value <= value_from_different_row

나는 키 => 값 저장소로 2 열이있는 테이블을 사용하고, 나는 이런 일이 :

 
key   | value 
--------------------------- 
period_a_begin | 2014-01-01 
period_a_end | 2014-01-15 
period_b_begin | 2014-01-20 
period_b_end | 2014-02-15 

가 어떻게 period_a_end의 새로운 값이 크거나 같은 것을 확인 할 수 있습니다 period_a_begin 값의 값보다 작거나 period_a_end를 업데이트하는 데 사용하는 동일한 SQL 쿼리에서 period_b_begin의 값보다 작거나 같습니까?

내가 서브 쿼리를 사용하여 시도했지만 성공하지 :

 
You can't specify target table configtable for update in FROM clause 

내가 그 오류가 팝업 이유를 이해하지만, 나는이를 찾기 위해 실패 :

 
UPDATE configtable 
SET configtable.value=:myvalue 
WHERE configtable.key="period_a_end" 
AND :myvalue >= (SELECT configtable.value FROM configtable WHERE configtable.key = "period_a_begin") 
AND :myvalue <= (SELECT configtable.value FROM configtable WHERE configtable.key = "period_b_begin"); 

을 나는 다음과 같은 오류가 계속 방법은 내 준비 문에서 전체 수표를 제거하지 않고이 일을 할 수있는 방법을 찾을 수 있습니다. :/

아이디어가 있으십니까?

답변

0

이렇게 우아하지는 않지만 정상적으로 작동합니다. 당신은 중첩 된 쿼리의 추가 수준 사용할 수 있습니다 결국

UPDATE configtable 
    SET configtable.value = :myvalue 
WHERE configtable.key="period_a_end" AND 
     :myvalue >= (select value from (SELECT ct.value FROM configtable ct WHERE ct.key = "period_a_begin") ct) AND 
     :myvalue <= (select value from (SELECT ct.value FROM configtable ct WHERE ct.key = "period_b_begin") ct); 
+0

고마워요. 우아하지 않을뿐만 아니라, MySQL 서버의 이러한 동작이 버그로 간주 될 수 있는지 확신 할 수 없습니다. 따라서 미래에 시간이 변경되거나 수정 될 수 있습니다. – user3485397

+0

@ user3485397. 나는 우아함의 부족함을 이해할 수 있지만 "버그"부분이 무엇을 의미하는지 알지 못합니다. 서브 쿼리의 추가 레이어가 있거나없는 쿼리는 표준 SQL입니다. 두 번째 레이어는 버그를 해결하는 데 필요합니다. 현재의 MySQL 구현에서. –

0

을, 나는 PHP에서 수표가 하나의 SQL 트랜잭션에 전체 검사, 포장, 여러 쿼리를 사용하여 구현하기 위해 선택했습니다. 그러나 트랜잭션이 MyISAM 스토리지 엔진에서 작동하지 않도록 조심하십시오. 따라서 InnoDB 나 트랜잭션을 지원하는 다른 엔진을 사용해야합니다.

저장 프로 시저가 빠르다는 것 외에도이 솔루션은 나에게도 (적어도 데이터베이스 측면에서는) 더 이식성이 좋은 것처럼 보입니다.