Cập nhật nhiều hàng trong một bảng với một câu lệnh?


9

Cách dễ nhất để cập nhật nhiều hàng trong một bảng là gì? Tôi có một tệp csv trông như thế này:

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

Hàng với các khóa chính này đã tồn tại trong bảng đích

Tôi muốn cập nhật bảng mục tiêu với các giá trị này. Có cú pháp để tôi có thể viết một cái gì đó như:

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

Nhìn qua Tham khảo cập nhật MySQL , trang web này ( cập nhật MySQL - csv ), SO ( cập nhật nhiều hàng , cập nhật nhiều db , cập nhật nhiều hàng ), tôi nghi ngờ rằng câu trả lời là "không", nhưng tôi muốn xác nhận rằng là đúng.


Tôi đã thêm thẻ MySQL giả sử rằng các tham chiếu của bạn đến tài liệu MySQL ngụ ý đó là cơ sở dữ liệu bạn đang sử dụng.
Hang động Justin

Câu trả lời:


9

Đầu tiên ở đây là dữ liệu mẫu

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>

Đây là truy vấn mới

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;

Đây là truy vấn mới được thực hiện

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>

3

Giả sử rằng bạn không muốn tải dữ liệu từ tệp CSV vào bảng cơ sở dữ liệu và sau đó thực hiện tương quan 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)

sau đó bạn sẽ có thể sử dụng một 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.