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


132

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';

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

도와주세요?


1
어떤 데이터베이스를 사용하고 있습니까?
Hart CO

MySQL 데이터베이스를 사용하고 있습니다.
user3022527 2013

선택에서 업데이트하면 대답이 될 수 있습니다. stackoverflow.com/questions/2334712/…
Jonathan Benn 2016 년

답변:


167

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

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 데모입니다


1
그렇습니다.하지만 한 번의 쿼리로 16 개의 레코드를 업데이트하려는 경우 어떻게됩니까? JOIN x 16을 사용해야합니까?
user3022527

19
당신은 해야 첫번째 장소에있는 귀하의 질문에 같은 중요한 세부 사항을 언급. 어쨌든 다른 솔루션에 대한 업데이트 된 답변 (조건부 업데이트)을 참조하십시오.
peterm

1
귀하의 예에서 t1과 t2는 무엇입니까?
Paul Brewczynski

1
안녕하세요 @PaulBrewczynski. 이들은 테이블 별명이며 선택적 config AS t1위치 AS에 쓸 수 있습니다 .
peterm

@peterm : SQLFiddle 링크가 끊어졌습니다. 그렇지 않으면 조건부 업데이트 기술이 제대로 작동합니다. 감사!
Jonathan Benn

142

아래와 같이 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);

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


26
꽤 똑똑한 해킹. 나는 놀랐다.
Blaise

6
Postgres에서는 지원되지 않음 : stackoverflow.com/questions/1109061/…
kevzettler

또한 약간의 텍스트 편집으로 약간의 CSV (또는 많은)를 테이블 삽입 / 업데이트 / 업데이트로 전환하는 좋은 방법입니다!
wulftone

6
이것은 Postgres 또는 MSSQL이 아닌 MySQL 솔루션입니다.
Rz Mk

1
레코드를 삽입하거나 업데이트하지 않아도 자동 증분 ID가 증가합니다.
Timo Huovinen

15

내 경우에는 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을 업데이트해야합니다.


여기서 가장 좋은 것 중 하나는 저에게 큰 도움이되었습니다.
Shahrukh Anwar

7

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

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) 인 경우 삽입합니다.


1
내가 볼 수 있듯이 id는 쿼리에 따라 테이블에 대해 pk입니다.
Sritam Jagadev

6

카밀의 해결책이 효과가있었습니다. 기본 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;
    }

5

이 대신

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');

3

아래 코드를 실행하여 n 개의 행 수를 업데이트하십시오. 여기서 부모 ID는 데이터를 가져 오려는 ID이고 자식 ID는 업데이트해야 할 ID이므로 업데이트하려면 부모 ID와 자식 ID를 추가하면됩니다. 작은 행을 사용해야하는 모든 행.

    UPDATE [Table]
 SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
 WHERE IDCouloumn IN ([List of child Ids])

2

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

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


1

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

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

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

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

3
다른 행에 다른 값이 있으면 어떻게됩니까? 예를 들어 UPDATE staff SET salary = 1125 WHERE name = 'Bob'; 직원 업데이트 연봉 = 1200 WHERE name = 'Jane'; 직원 업데이트 연봉 = 1100 여기서 name = 'Frank'; 직원 업데이트 연봉 = 1175 여기서 name = 'Susan'; 업데이트 직원 SET 급여 = 1150 여기서 name = 'John';
압둘라 Nurum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.