IT박스

SQL-하나의 쿼리에서 여러 레코드 업데이트

itboxs 2020. 8. 3. 08:38
반응형

SQL-하나의 쿼리에서 여러 레코드 업데이트


table- config가 있습니다. 개요:config_name | config_value

그리고 하나의 쿼리로 여러 레코드를 업데이트하고 싶습니다. 나는 그렇게 시도 :

UPDATE config 
SET t1.config_value = 'value'
  , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
  AND t2.config_name = 'name2';

그러나 그 쿼리는 잘못되었습니다 :(

도와주세요?


다중 테이블 업데이트 구문을 사용해보십시오.

UPDATE config t1 JOIN config t2
    ON t1.config_name = 'name1' AND t2.config_name = 'name2'
   SET t1.config_value = 'value',
       t2.config_value = 'value2';

다음은 SQLFiddle 데모입니다

또는 조건부 업데이트

UPDATE config
   SET config_value = CASE config_name 
                      WHEN 'name1' THEN 'value' 
                      WHEN 'name2' THEN 'value2' 
                      ELSE config_value
                      END
 WHERE config_name IN('name1', 'name2');

다음은 SQLFiddle 데모입니다


아래와 같이 INSERT로이를 수행 할 수 있습니다.

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

이렇게하면 새 값이 테이블에 삽입되지만 기본 키가 중복되어 (이미 테이블에 삽입 된 경우) 지정한 값이 업데이트되고 동일한 레코드가 두 번째로 삽입되지 않습니다.


내 경우에는 1000 개가 넘는 레코드를 업데이트해야합니다.이를 선호 할 때마다 업데이트 쿼리를 누르는 대신

   UPDATE mst_users 
   SET base_id = CASE user_id 
   WHEN 78 THEN 999 
   WHEN 77 THEN 88 
   ELSE base_id END WHERE user_id IN(78, 77)

78,77은 사용자 ID이며 해당 사용자 ID의 경우 base_id 999 및 88을 각각 업데이트해야합니다.


아마 누군가에게 유용 할 것입니다

PostgreSQL 9.5의 매력으로 작동

INSERT INTO tabelname(id, col2, col3, col4)
VALUES
    (1, 1, 1, 'text for col4'),
    (DEFAULT,1,4,'another text for col4')
ON CONFLICT (id) DO UPDATE SET
    col2 = EXCLUDED.col2,
    col3 = EXCLUDED.col3,
    col4 = EXCLUDED.col4

이 SQL은 기존 레코드를 업데이트하고 새 레코드 (2 in 1) 인 경우 삽입합니다.


카밀의 해결책이 효과가있었습니다. 기본 PHP 함수로 바꾸어 SQL 문을 작성합니다. 이것이 다른 누군가를 돕기를 바랍니다.

    function _bulk_sql_update_query($table, $array)
    {
        /*
         * Example:
        INSERT INTO mytable (id, a, b, c)
        VALUES (1, 'a1', 'b1', 'c1'),
        (2, 'a2', 'b2', 'c2'),
        (3, 'a3', 'b3', 'c3'),
        (4, 'a4', 'b4', 'c4'),
        (5, 'a5', 'b5', 'c5'),
        (6, 'a6', 'b6', 'c6')
        ON DUPLICATE KEY UPDATE id=VALUES(id),
        a=VALUES(a),
        b=VALUES(b),
        c=VALUES(c);
    */
        $sql = "";

        $columns = array_keys($array[0]);
        $columns_as_string = implode(', ', $columns);

        $sql .= "
      INSERT INTO $table
      (" . $columns_as_string . ")
      VALUES ";

        $len = count($array);
        foreach ($array as $index => $values) {
            $sql .= '("';
            $sql .= implode('", "', $array[$index]) . "\"";
            $sql .= ')';
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= "\nON DUPLICATE KEY UPDATE \n";

        $len = count($columns);
        foreach ($columns as $index => $column) {

            $sql .= "$column=VALUES($column)";
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= ";";

        return $sql;
    }

모든 열의 모든 레코드를 업데이트하려면 아래 코드를 실행하십시오.

update config set column1='value',column2='value'...columnN='value';

특정 행의 모든 ​​열을 업데이트하려면 아래 코드를 실행하십시오.

update config set column1='value',column2='value'...columnN='value' where column1='value'

A1 열에 config_valueB1에 config_name사용하여 Excel 스프레드 시트에서 업데이트 할 값 목록이 있다고 가정하면 Excel 수식을 사용하여 쿼리를 쉽게 작성할 수 있습니다.

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")


이 대신

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

당신이 사용할 수있는

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');

참고 URL : https://stackoverflow.com/questions/20255138/sql-update-multiple-records-in-one-query

반응형