2009-09-15 2 views
1

안녕하세요, "id", "name"및 "weight"열이있는 테이블이 있습니다. 가중치는 부호없는 작은 int입니다.(내) SQL 일괄 업데이트

"체중 ASC"로 주문한 품목을 표시하는 페이지가 있습니다. 드래그 앤 드롭을 사용하고 순서가 변경되면 쉼표로 구분 된 문자열 (새로운 순서로)이 전달됩니다.

해당 테이블에는 10 개의 항목이 있다고 가정 해 보겠습니다.

샘플 입력 :

5,6,2,9,10,4,8,1,3,7 

샘플 PHP 핸들러 (오류 처리기 제외 & 보안 물건을) : 여기에 지금까지 가지고 무엇

<?php 
$weight = 0; 
$id_array = explode(',', $id_string); 

foreach ($id_array as $key => $val) 
{ 
    mysql_query("UPDATE tbl SET weight = '$weight' where id = '$val' LIMIT 1"); 
    $weight++; 
} 
?> 

내가 열 순서를 변경, 스크립트에서 10 개의 별도 UPDATE 쿼리를 작성해야합니까, 아니면 더 좋은 방법이 있습니까?

답변

3

단일 쿼리에서 하나의 where 절만 지정할 수 있습니다. 즉, 한 번에 하나의 행만 업데이트 할 수 있습니다. 나는이 문제의 종류를 통과 할 경우

10 개 항목으로


, 나도 몰라 (그 의미를 다시 작성하는 몇 가지 코드를 - 그게 그렇게 어렵지 않다하더라도) 더 A에 대한,하지만,

  • insert 물론, 그들에게 transaction 모두 그 일을 모두 다시
  • 을이야

    • delete 모든 행 : 해결하는 것입니다.

    멋진 점은 하나의 쿼리에서 여러 개의 insert을 수행 할 수 있다는 것입니다. 10 개 항목에 대해서는 알지 못하지만, 25 개 또는 50 개 항목에 대해서는 매우 유용 할 수 있습니다. 여기

    는 (인용)에 insert page of the MySQL manual에서 예이다 : 복수의 열을 삽입 할 수 VALUES 구문을 사용

    INSERT 문. 을 사용하려면 열의 여러 목록을 포함하고 각각은 괄호로 묶고 쉼표로 구분합니다.
    예 :

    물론
    INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 
    

    , 당신은 아마 하나의 삽입 쿼리에서 "너무 많은"항목을 삽입하지 말아야은 - 가 (이하 "권리를 찾을 수 있지만 50 개 항목 당 삽입, OK 수 있습니다 "항목 수가 많으면 벤치 마크해야합니다. ^^)

  • +0

    모두에게 감사드립니다. – Matt

    1

    네, 업데이트를 10 번해야합니다. mysql_query에 대한 한 번의 호출로 여러 쿼리를 일괄 처리 할 수있는 방법이 있지만이를 피하는 것이 가장 좋습니다.

    성능이 걱정된다면 걱정하지 말고 먼저 시도하십시오. 10 개 (또는 심지어 20 개 또는 30 개)의 업데이트를하는 것이 충분히 빠를 것이라고 생각합니다.

    1

    10 업데이트는 개념적으로 가장 간단한 방법입니다. bazillion 행을 업데이트해야하는 경우 임시 테이블을 만들고 UPDATE 문에서 JOIN을 사용하거나 행 생성자를 사용하여 하위 쿼리를 사용하는 등 다른 시도를해야 할 수도 있습니다.

    8

    임시 데이터 테이블에 새 데이터 (예 : ID 및 가중치가있는 열)를 만든 다음이 데이터로 테이블을 업데이트 할 수 있습니다.

    create temporary table t (id int, weight float); 
    
    insert into t(id, weight) values (1, 1.0), (2, 27), etc 
    
    update tbl inner join t on t.id = tbl.id 
    set tbl.weight = t.weight; 
    

    따라서 하나의 create 문, 하나의 insert 문 및 하나의 update 문이 있습니다.

    0

    일괄 삽입으로 임시 테이블에 레코드를 저장하고 tbl에서 레코드를 삭제 한 다음 임시 테이블에서 일괄 처리합니까?