단일 명령문으로 테이블의 많은 행을 업데이트 하시겠습니까?


9

테이블에서 많은 행을 업데이트하는 가장 쉬운 방법은 무엇입니까? 다음과 같은 CSV 파일이 있습니다.

|primary_key |value|
|          1 |  xyz|
|          2 |  abc|
|          3 |  def|
...

이 기본 키가있는 행이 대상 테이블에 이미 존재합니다

이 값으로 대상 테이블을 업데이트하고 싶습니다. 다음과 같이 작성할 수 있도록 구문이 있습니까?

update mytable set value = ('xyz', 'abc', 'def') where primary key = (1,2,3);

관통 찾고 MySQL을 업데이트 참조 하고 있으며,이 사이트 ( MySQL의 - CSV 업데이트 ), SO ( 갱신 여러 행 , 여러 DB 업데이트 , 업데이트를 여러 행 ), 나는 대답은 "아니오"라고 생각하지,하지만 난 확인하고 싶습니다이 그 사실이다.


MySQL 설명서에 대한 참조가 사용중인 데이터베이스임을 암시한다고 가정하여 MySQL 태그를 추가했습니다.
Justin Cave

답변:


10

먼저 샘플 데이터는

mysql> drop table if exists mytable;
Query OK, 0 rows affected (0.03 sec)

mysql> create table mytable
    -> (
    ->     id int not null,
    ->     value VARCHAR(255),
    ->     primary key (id)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into mytable (id) values (1),(2),(3);
Query OK, 3 rows affected (0.06 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from mytable;
+----+-------+
| id | value |
+----+-------+
|  1 | NULL  |
|  2 | NULL  |
|  3 | NULL  |
+----+-------+
3 rows in set (0.00 sec)

mysql>

여기 새로운 쿼리가 있습니다

update mytable A inner join
(
    SELECT 1 id,'xyz' value UNION
    SELECT 2   ,'abc'       UNION
    SELECT 3   ,'def'

) B USING (id)
SET A.value = B.value;

실행 된 새 쿼리는 다음과 같습니다.

mysql> update mytable A inner join
    -> (
    ->     SELECT 1 id,'xyz' value UNION
    ->     SELECT 2   ,'abc'       UNION
    ->     SELECT 3   ,'def'
    -> ) B USING (id)
    -> SET A.value = B.value;
Query OK, 0 rows affected (0.06 sec)
Rows matched: 3  Changed: 0  Warnings: 0

mysql> select * from mytable;
+----+-------+
| id | value |
+----+-------+
|  1 | xyz   |
|  2 | abc   |
|  3 | def   |
+----+-------+
3 rows in set (0.00 sec)

mysql>

UPDATE table INNER JOIN ... USING(id) SET ...대단하다
Nino Škopac

3

CSV 파일의 데이터를 데이터베이스 테이블로로드하지 않고 상관을 수행한다고 가정하면 UPDATE,

UPDATE mytable t
   SET value = (SELECT value
                  FROM tbl_with_csv_data csv
                 WHERE csv.primary_key = t.primary_key)
 WHERE EXISTS( SELECT 1
                 FROM tbl_with_csv_data csv
                 WHERE csv.primary_key = t.primary_key)

다음을 사용할 수 있어야합니다 CASE

UPDATE mytable t
   SET value = CASE WHEN primary_key = 1 THEN 'xyz'
                    WHEN primary_key = 2 THEN 'abc'
                    WHEN primary_key = 3 THEN 'def'
                    ELSE value
                END
 WHERE primary_key IN (1,2,3);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.