source

where 문이 있는 대량 업데이트 mysql

goodcode 2022. 10. 6. 21:37
반응형

where 문이 있는 대량 업데이트 mysql

대량으로 mysql 데이터를 업데이트하려면 어떻게 해야 합니까?다음과 같은 것을 정의하는 방법:

UPDATE `table` 
WHERE `column1` = somevalues
SET  `column2` = othervalues

다음과 같은 값을 사용합니다.

VALUES
    ('160009'),
    ('160010'),
    ('160011');

기타 값:

VALUES
    ('val1'),
    ('val2'),
    ('val3');

mysql - php 스크립트에서는 불가능할지도 모릅니다.

당신의 경우 가장 쉬운 해결책은 시공법을 사용하는 것입니다.그것은 매우 빠르게 작동하며, 그 일을 쉽게 한다.

INSERT into `table` (id, fruit)
    VALUES (1, 'apple'), (2, 'orange'), (3, 'peach')
    ON DUPLICATE KEY UPDATE fruit = VALUES(fruit);

또는 건축을 이용하다

UPDATE table
SET column2 = (CASE column1 WHEN 1 THEN 'val1'
                 WHEN 2 THEN 'val2'
                 WHEN 3 THEN 'val3'
         END)
WHERE column1 IN(1, 2 ,3);

보유하고 있는 "bulk" 데이터가 동적이며 PHP에서 가져온 데이터(태그 부착)라면 쿼리는 다음과 같습니다.

INSERT INTO `foo` (id, bar)
VALUES 
    (1, 'pineapple'),
    (2, 'asian pear'),
    (5, 'peach')
ON DUPLICATE KEY UPDATE bar = VALUES(bar);

기존 어레이에서 이를 생성하기 위한 PHP를 사용합니다(배열이 다음과 같은 형식이라고 가정합니다).

$array = (
    somevalues_key => othervalues_value
);

는 다음과 같습니다(최선은 아닙니다(예를 들어 주소를 이스케이프하거나 값을 삭제하지 않는 등).단순한 예에 불과합니다).

$pairs = array();
foreach ($array as $key => $value) {
    $pairs[] = "($key, '$value')";
}

$query = "INSERT INTO `foo` (id, bar) VALUES " . implode(', ', $pairs) . " ON DUPLICATE KEY UPDATE bar = VALUES(bar)";

드래그 앤 드롭 table View 또는 collection View를 사용하여 사용자가 드래그 앤 드롭 기능으로 사진을 정렬할 수 있도록 하는 등 앱 내의 데이터를 정렬하는 경우 사용자 편집이 완료된 후 정렬된 ID 목록을 쉼표로 백엔드로 전송합니다.

백엔드에서 다음과 같은 ID를 어레이로 분해합니다.

$new_ranks = array();
$supplied_orders = explode(",", $_POST["supplied_new_order"]); //52,11,6,54,2 etc
$start_order = 99999;
foreach ($supplied_orders as $supplied_row_id) {
    //your all validations... make sure supplied_row_id belongs to that user or not etc..

    $new_ranks[intval($supplied_row_id)] = $start_order--;
}

이제 @Farside Recommendation 2와 같은 모든 새로운 순위를 업데이트할 수 있습니다.

if (count($new_ranks) > 0) {
    $case_sqls = array(); 
    foreach ($new_ranks as $id => $rank) {
        $case_sqls[] = "WHEN ".intval($id)." THEN ".intval($rank)."";
    } 
    $case_sql = implode(" ", $case_sqls);

    $this->db->query("
        UPDATE 
            service_user_medias
        SET 
            rank = (CASE id ".$case_sql." END)
        WHERE 
            id IN(".implode(",", array_keys($new_ranks)).");
    ");
}

다음과 같이 JOIN을 사용하여 업데이트를 시도할 수 있습니다.

UPDATE table
INNER JOIN (
            SELECT 1 column1, 2 column2, 10 new_v1, 20 new_v2, 30 new_v3
  UNION ALL SELECT 4 column1, 5 column2, 40 new_v1, 50 new_v2, 60 new_v3
) updates
  ON table.column1 = updates.column1
  AND table.column2 = updates.column2
SET
  table.column1 = updates.new_v1,
  table.column2 = updates.new_v2,
  table.column3 = updates.new_v3;

네가 내부를 만들 수만 있다면SELECT의 성명updates서브쿼리에서는 이러한 모든 업데이트를 하나의 스테이트먼트에서 실행할 수 있습니다(테이블 크기에 따라 InnoDB의 퍼포먼스가 향상됩니다).

데이터가 배열 형식인 경우 다음을 수행하십시오.

그리고 당신의 질문은"UPDATE table WHERE column1 = ? SET column2 = ?"

그리고 아래와 같이 설정합니다.

foreach($data as $key => $value) {
    $query->bind_param('ss', $key, $value);
    $query->execute();
}

효과가 있길 바라야죠

여기서부터의 참조.

언급URL : https://stackoverflow.com/questions/35726910/bulk-update-mysql-with-where-statement

반응형