>  기사  >  백엔드 개발  >  PHP에서 mysql의 데이터를 일괄 업데이트하는 방법

PHP에서 mysql의 데이터를 일괄 업데이트하는 방법

不言
不言원래의
2018-07-26 11:46:593594검색

이 문서의 내용은 PHP를 사용하여 MYSQL에서 데이터를 일괄 업데이트하는 방법에 대한 것입니다. 내용이 매우 상세하므로 도움이 필요한 친구에게 도움이 되기를 바랍니다.

이 사업에서는 두 개의 데이터 테이블을 업데이트해야 하기 때문에 매우 간단하다고 생각하실 것이고, 바로 코드를 작성할 수 있습니다

$sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']";

데이터 테이블은 newhouse_clicks이며 기본 키 ID인 4개의 필드가 있습니다. , 유형(유형-정수) 유형) 필드, 클릭수(클릭 - 정수 유형) 필드, update_time(정수 유형) 필드
이거 정말 문제 없나요? 예를 들어 베이징 등 현재 도시의 모든 부동산을 일괄 업데이트하려는 경우(예: 1,000개의 데이터) 비즈니스에서는 다음과 같이 작성해야 합니다

$data = array(id=>1,id=>2,..........id=>1000);//省略数据
foreach($data as $key=>$value) {
    $sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']";
}

여러 테이블이 관련된 경우 * 1,000개의 데이터, 그러면 큰 지연이 발생할까요?

결과는 그렇습니다. 그녀가 이렇게 글을 쓰다 보니 서버가 타임아웃되었습니다!

JAVA 등의 언어에 익숙하신 분들이라면 JAVA가 내부적으로 SQL을 일괄 업데이트하는 기능을 제공한다는 사실을 아셔야 할텐데요. 그렇다면 세계 최고의 언어인 PHP가 이를 할 수 있을까요? 대답은 그렇습니다!

그럼 일괄 업데이트를 위한 sql문을 배워보겠습니다.

UPDATE newhouse_clicks
    SET clicks = CASE id
        WHEN 1 THEN 1000
        WHEN 2 THEN 2000
        WHEN 3 THEN 3000
    END
WHERE id IN (1,2,3)

인내심을 갖고 이 SQL 문의 의미를 자세히 설명해 보겠습니다.
newhouse_clicks 데이터 테이블의 clicks 필드를 업데이트하세요. id=1이면 값이 1000으로 설정됩니다. id=2이면 값이 로 설정됩니다. 2000. id =3일 때 값을 3000

으로 설정하면 여러 필드를 업데이트할 수 있나요? 물론 다음 코드를 게시할 수도 있습니다.

UPDATE newhouse_clicks
    SET clicks = CASE id
        WHEN 1 THEN 1000
        WHEN 2 THEN 2000
        WHEN 3 THEN 3000
    END,
    type = CASE id
        WHEN 1 THEN 1
        WHEN 2 THEN 6
        WHEN 3 THEN 8
    END
WHERE id IN (1,2,3)

이 SQL 문의 의미는 newhouse_clicks 데이터 테이블의 클릭 필드를 업데이트하는 것입니다. id=1이면 값이 1000으로 설정되고, id=2이면 값은 다음과 같습니다. 2000으로 설정, id=3인 경우 값을 3000으로 설정, 유형 필드 업데이트, id=1인 경우 유형 필드를 1로 업데이트, id=2인 경우 유형 필드를 6으로 업데이트, id=3인 경우 유형 필드 업데이트 필드를 8에 입력합니다.
그렇다면 세계 최고의 언어인 PHP는 SQL을 쓸 수 없는 걸까요?

//查询数据库返回的数据格式
$newhouse_clicks = array(
=> 2,
=> 3,
=> 8,
=> 9,
  );
$ids = implode(',', array_keys($newhouse_clicks ));
$sql = "UPDATE newhouse_clicks SET clicks = CASE id ";
foreach ( $newhouse_clicks as $key => $value) {
    $sql .= sprintf("WHEN %d THEN %d ", $key, $value);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;

위의 SQL 문과 동일한지 확인해주세요!

그럼 실제 데이터는 이보다 더 복잡할까요? 물론, 질문에 따라 우리가 일반적으로 데이터베이스에서 가져오는 데이터의 형식은 다음과 같습니까?

//查询数据库返回的数据格式
$newhouse_clicks = array(
=> array('clicks'=>1,'type'=>1,'update_time'=>time()),
=> array('clicks'=>2,'type'=>2,'update_time'=>time()),
=> array('clicks'=>3,'type'=>3,'update_time'=>time()),
=> array('clicks'=>4,'type'=>4,'update_time'=>time()),
);
?>

그러면 이런 상황에서는 어떻게 해야 할까요?

da39b25861c68baa73de965ae2d0e688 array('clicks'=>1,'type'=>1,'update_time'=>time()),
=> array('clicks'=>2,'type'=>2,'update_time'=>time()),
=> array('clicks'=>3,'type'=>3,'update_time'=>time()),
=> array('clicks'=>4,'type'=>4,'update_time'=>time()),
);
    //获取所有的id
    $newhouse_clicks_keys = array_keys($newhouse_clicks);
    //拼接批量更新sql语句
    $sql = "UPDATE newhouse_clicks SET ";
    //合成sql语句
    foreach ($newhouse_clicks[1] as $key => $value) {
        $sql .= "{$key} = CASE id ";
        foreach ($newhouse_clicks as $newhouse_clicks_key=>$newhouse_clicks_value) {
 
            $sql .= sprintf("WHEN %d THEN %d ", $newhouse_clicks_key, $newhouse_clicks_value[$key]);
        }
        $sql .= "END, ";
    }
    //把最后一个,去掉
    $sql = substr($sql, 0, strrpos($sql,',')); 
    //合并所有id
    $ids = implode(',', $newhouse_clicks_keys);
    //拼接sql
    $sql .= " WHERE ID IN ({$ids})";
    echo $sql;

사실 그냥 mysql 문으로 조합하려고 단어를 너무 많이 썼어요.

완료! 속도는 실크처럼 부드럽습니다! ㅋㅋ                                                                             많은 프로그래머, 특히 초보자는 쉽게 오해에 빠지고 SQL에서 데이터를 가져오는 과정을 for 루프에 넣을 수 있습니다. 이렇게 쓰면 문제가 발생하는데, 심각한 혼잡이 발생합니다. 실제 생활에도 이런 예가 있습니다.

​​​​예를 들어 12층에서 일하는데 택배기사가 전화해서 아래층으로 내려오라고 합니다. 택배(총 12개)를 수령하려면 택배를 수령하는 방법은 두 가지가 있습니다.

        1. 첫 번째 택배를 받고 12층으로 돌아가서 치운 후 다음 택배를 수령하세요. 택배기사님, 12층에 맡기시고 다음 택배로 받아가세요.

2. 특급배송은 모두 12층으로 한번에 가져가세요.个 누구나 분명 두 번째 계획을 선택할 것입니다. 택배를 받기 위해 12번을 달려가는 사람은 없을 것입니다.述 컴퓨터는 위의 원칙에 따라 for 루프에서 리소스를 가져옵니다. 첫 번째 솔루션과 유사합니다. 일괄적으로 데이터를 가져오는 것은 두 번째 솔루션과 유사합니다. (PS: mysql에서 데이터를 검색하는 데 이런 문제가 있을 것이라고 생각하지 마세요. Redis에도 이런 문제가 있을 것입니다. 그렇지 않으면 배치 데이터를 가져오는 파이프라인이 어떻게 있을 수 있습니까? 인터뷰할 때 인터뷰 질문으로 자주 묻는 질문입니다. . 네, 분명 사람의 기술 수준을 측정하는 기준이 될 것입니다)

관련 추천 :

php에서 mvc의 원리는 무엇인가요? PHP의 MVC 구현 원리 소개(코드 포함)

PHP 메소드 코드에서 Qiniu에 파일을 업로드하는 방법

위 내용은 PHP에서 mysql의 데이터를 일괄 업데이트하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.