2016-12-01 4 views
0

일부 코드를 재구성합니다. 이것은 PHP - MYSQL 프로젝트입니다. 그래서 하나의 쿼리 또는 적어도 두 개의 일부 테이블을 업데이트하려고합니다.사례 및 하위 쿼리를 사용하여 다중 테이블 업데이트 MySql

조인이 없어도 달성 할 수 있습니까? 최선의 선택은 무엇입니까?

UPDATE document D SET D.status = 2, 
    CASE 
     WHEN D.type 'A' THEN (UPDATE table_1 SET active = 1 WHERE id_table1 = D.id_document) 
     WHEN D.type 'B' THEN (UPDATE table_2 SET active = 1 WHERE id_table2 = D.id_document) 
     WHEN D.type 'C' THEN (UPDATE table_3 SET active = 1 WHERE id_table3 = D.id_document)    
    END 
WHERE D.id_document = %s 

나는 첫 번째 테이블의 "문서 D를"분리 괜찮다,하지만 그들은 11 개 테이블처럼 때문에 단일 쿼리에서 여러 테이블을 갱신하는 나는 "때 사건을"이 필요합니다.

답변

0

질문에 대답을 남기지 마십시오. 내가 조사한 것을 바탕으로.

  • 아니요, 하위 쿼리에서 '업데이트'를 수행 할 수 없습니다.
  • 아니요, 그런 '사례'를 사용할 수 없습니다. 수행 할 수 있습니다

있는 유일한 방법은 다음과 같습니다

를 사용하여 여러 테이블

UPDATE table_1 
INNER JOIN table_2 ON table_1.id = table_2.id 
INNER JOIN table_3 ON table_3.id = table_3.id 
SET table_1.column = '', table_2.column = '' 
WHERE any condition; 

그리고 "사건"을 업데이트 할 조인 단 하나의 방법

UPDATE table SET 
column = CASE columX WHEN 'A' THEN '2' ELSE column END, 
column2 = CASE columX WHEN 'B' THEN '2' ELSE column2 END 
에서 사용할 수 있습니다

둘을 결합하여 필요한 것을 얻을 수있었습니다.

"where"를 사용하여 다양한 유형의 참여 및 재생을 할 수 있습니다. "case"절에서 열을 업데이트하는 것은 선택 사항이 아닌 필수 항목이므로 "else"에서 동일한 열을 사용하여 해당 열을 업데이트 할 필요가 없을 때 기본값으로 남겨 둡니다.

0

성능을 향상시키기 위해이 모든 것을 하나의 쿼리에 넣으려고합니까? 이 경우 하위 쿼리가 개별적으로 실행될 때와 동일한 시간이 걸리기 때문에이 경우 도움이되지 않습니다.

PHP 코드에서 테이블 이름을 확인한 다음 더 간단한 쿼리 문자열로 전달하면 훨씬 더 깨끗한 코드와 더 나은 성능을 얻을 수 있습니다.

+0

이 오래된 코드는 "mysqli_query()"호출이 너무 많습니다. 단순한 반복적 인 업데이트의 경우처럼 32와 같습니다. 선의 양을 줄이고 싶었습니다. 또한 빠른 복사/붙여 넣기 테스트를 수행하는 간단한 SQL을 사용합니다. 배열에 테이블을 넣고 빌드하고 실행할 수 있습니다. 난 PHP와 SQL을 구축하지 않으려 고 노력 중입니다. –

+0

죄송합니다, mysql에서 하나의 쿼리로 할 수있는 방법이 없습니다. 지금까지 가장 깨끗한 코드 솔루션은 변수에서 테이블 이름을 전달하는 것입니다. 빈약 한 데이터베이스 스키마 디자인을 수정하고 모든 테이블을 단일 테이블로 만들어 단일 간단한 업데이트로 작업을 수행하는 것이 더 나을 것입니다. 하지만이 코드는 오래된 코드라고 했으므로이 경우에는 비실용적 일 수 있습니다. –

+0

"업데이트 선택"이 존재할 수 있습니까? 하위 쿼리가 더있는 뭔가? 하나의 쿼리 일 필요는 없습니다. 다른 테이블 "table1, table2"등은 실제로 다르며 병합 할 수 없습니다. 하나는 영수증, 다른 하나는 지불을위한 것, 다른 하나는 송장을위한 것입니다. 그 (것)들 사이에서만 1 개의 란 이름을 공유하십시오. –