2010-01-04 8 views
4

테이블의 모든 레코드를 업데이트해야합니다 (100 개가 넘지 않아야 함). 각 레코드는 다른 값으로 업데이트 된 필드를 가져야합니다.MySQL : 하나의 쿼리로 전체 테이블을 업데이트하는 방법이 있습니까?

각 업데이트에 대한 쿼리를 작성해야합니까, 아니면 다른 방법이 있습니까? 한 번에 할 수없는 것 같습니다.

도움을 주셔서 감사합니다!

편집 : 명확히하기 위해 내가 업데이트하는 각 필드에는 클라이언트 측에서 결정되는 고유 한 값이 포함됩니다. 따라서 다른 테이블은 포함되지 않습니다.

+1

좀 더 자세한 정보가 필요합니다. 3에서 4로 변경하는 것처럼 필드를 증가시키고 있습니까? 모든 행이 동일한 "새로운"값을 얻고 있습니까? 새 값과 해당 기본 키 (또는 다른 필드)가 포함 된 데이터 집합이 있습니까? – sberry

답변

6

답변은 새로운 값의 출처에 따라 크게 달라집니다. 당신은 새로운 가치의 짧은 목록이있는 경우

, 당신은 CASE를 사용할 수 있습니다 : 새 값의 목록이 매우 긴 경우

UPDATE Table1 
SET column1 = CASE column1 
       WHEN 123 THEN ? 
       WHEN 456 THEN ? 
       ELSE ? 
       END; 

이 실용적이지 못하다.다른 테이블의 상관 관계 행에 존재하는 값으로 행을 업데이트해야하는 경우

, 당신은 MySQL을의 멀티 테이블 UPDATE 구문을 사용할 수 있습니다 :

UPDATE Table1 JOIN Table2 ON (Table1.pk = Table2.fk) 
SET Table1.column1 = Table2.column2; 

또한 상관 하위 쿼리와 비슷한 작업을 수행 할 수 있습니다. 나는 (그것을 멀티 테이블 갱신 또는 하위 쿼리를 지원하기 전에) 3.23을 사용하는 경우

UPDATE Table1 SET column1 = (SELECT column2 FROM Table2 WHERE Table2.fk = Table1.pk); 

오래 전, 내가 출력이 UPDATE 문을 완전히 형성 한 SELECT를 실행하는 것입니다. 모든 따옴표를 올바르게 작성하는 것은 까다로운 일 이었지만 결과는 수백 개의 개별 UPDATE 문의 SQL 스크립트였으며 각 행은 각각 하나의 행에서 값이 변경되었습니다. 별로 효율적이지는 않지만 드물게 수행해야하는 경우라면 괜찮습니다.

SELECT CONCAT(
    'UPDATE Table1 SET column1 = ', QUOTE(Table2.column2), 
    ' WHERE pk = ', Table2.fk, ';') AS SQL_statement 
FROM Table2; 
+0

도와 줘서 고마워! 귀하의 업데이트 - 케이스 쿼리를 시도했지만 작동하도록하지 않을거야. 이 오류가 나타납니다. # 1064 - SQL 구문에 오류가 있습니다. 라인 1에서 'CASE'근처에서 사용할 올바른 구문에 대해서는 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. UPDATE 테이블 1 SET 컬럼 1 = 사례 2 2 WHEN 123 THEN 7 WHEN 456 THEN 56 ELSE 0 END CASE; – user239237

+0

죄송 합니다만, MySQL 표현식의 끝 부분에 대한 구문은 단순히 'END' 인 반면 다른 RDBMS에서는'END CASE'를 선호합니다. 위의 예를 편집했습니다. –

0

각 행에 할당 할 값에 대해 알지 못하면 "아마도 아니오"라고 대답 할 수 있습니다. 또 다른 포스터는 WHERE 절을 생략하여 모든 행에 한 번에 영향을 미칠 수 있다고 언급했으나 각 행마다 고유 한 값이 필요한 경우 도움이되지 않습니다.

각 행에 어떤 값을 부여하는지 알 수있는 방법에 대한 정보를 제공 할 수 있다면 더 좋은 대답이 될 수 있습니다. 추가 정보를 기다리는 중 ...

0

업데이트 값이 레코드마다 다른 경우 매번 새 UPDATE 문을 만들어야합니다.

+0

이것은 완전히 사실이 아닙니다. 업데이트하려는 데이터가 다른 테이블에있는 경우 하나의 업데이트 문을 사용할 수 있습니다. –

+0

오 이런 생각하지 않았다 – antpaw

0

각 행의 새 값을 행의 현재 값에서 추론 할 수있는 경우 단일 UPDATE 쿼리에서이를 수행 할 수 있습니다. 그렇지 않으면 아니오.

한 방법은 (a 복수 행 삽입 쿼리를 사용하여), 별도의 테이블에 하나 개의 질의에 DELETE 또는 TRUNCATE 그 테이블 및 INSERT 모든 새로운 값을 자주 변경 항목을 저장하는 것이다.

MySQL에서는 첫 번째 방법을 개선하기 위해 ON DUPLICATE KEY UPDATE에 액세스 할 수 있습니다.

UPDATE table_name SET col1 = (col2/col3); 

그러나 새 값이 데이터베이스 외부 계산하는 경우 (: 당신이 뭔가를 할 수있는 각 값이 행에 다른 값에서 파생 간단한 식으로 계산 될 수있는 경우

0

, 예를 들어 스크립트로), 각 행에 대한 별도의 업데이트 쿼리보다 더 잘 수행 할 수는 없습니다.

0

각 필드에 다른 값이 필요하면 no.

배열에 값을 넣을 수 있으며 루프를 작성할 수 있으므로 수동으로 각 UPDATE를 쓸 필요가 없습니다.

$myIds = array('1', '2', '3'); 
$myField = array('something', 'something2', 'something3'); 

for($i=0; $i<count($myIds); $i++){ 
    mysql_query("UPDATE table SET field = '{$myField[$i]}' WHERE id = '{$myIds[$i]}'); 
} 

당신은 그것을 상당히 고통 만들 것입니다 귀하의 요구에 따라, SELECT 문을 통해 $의 myIds 및 $ myField 배열을 만들 수 있습니다.

사용자가 입력하는 경우 해당 변수를 살균해야합니다.

관련 문제