SQL - Cập nhật nhiều bản ghi trong một truy vấn


132

Tôi có bảng - cấu hình . Lược đồ: config_name | config_value

Và tôi muốn cập nhật nhiều hồ sơ trong một truy vấn. Tôi cố gắng như thế:

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

nhưng truy vấn đó sai :(

Bạn có thể giúp tôi được không?


1
Bạn đang dùng gói dữ liệu nào vậy?
Hart CO

Tôi đang sử dụng cơ sở dữ liệu MySQL.
dùng3022527

Cập nhật từ Chọn có thể là câu trả lời stackoverflow.com/questions/2334712/ Khăn
Jonathan Benn

Câu trả lời:


167

Hãy thử cú pháp cập nhật nhiều bảng

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

Đây là bản demo SQLFiddle

hoặc cập nhật có điều kiện

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

Đây là bản demo SQLFiddle


1
Vâng, điều đó tốt nhưng khi tôi muốn cập nhật 16 bản ghi trong một truy vấn thì sao? Tôi sholud sử dụng THAM GIA x 16?
dùng3022527

19
Bạn nên đề cập đến các chi tiết quan trọng như vậy trong câu hỏi của bạn ở nơi đầu tiên. Dù sao, xem câu trả lời cập nhật cho một giải pháp khác (cập nhật có điều kiện).
peterm

1
T1 và t2 trong ví dụ của bạn là gì?
Paul Brewczynski

1
Xin chào bạn cũng vậy @PaulBrewczynski. Đây là các bí danh bảng và có thể được viết config AS t1ở đâu ASlà tùy chọn.
peterm

@peterm: các liên kết SQLFiddle bị hỏng. Nếu không, kỹ thuật cập nhật có điều kiện đang làm việc tuyệt vời. Cảm ơn!
Jonathan Benn

142

Bạn có thể hoàn thành nó với INSERT như dưới đây:

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

Điều này chèn các giá trị mới vào bảng, nhưng nếu khóa chính được sao chép (đã được chèn vào bảng) thì các giá trị bạn chỉ định sẽ được cập nhật và cùng một bản ghi sẽ không được chèn lần thứ hai.


26
một hack khá thông minh. Tôi ngạc nhiên.
Blaise

6
Không được hỗ trợ cho Postgres, hãy xem: stackoverflow.com/questions/1109061/ từ
kevzettler

Ngoài ra, đó là một cách tuyệt vời để biến một chút CSV (hoặc rất nhiều) thành một bảng chèn / cập nhật / upert với một số chỉnh sửa văn bản nhỏ!
wulftone 8/12/2016

6
Đây là một giải pháp MySQL, không phải Postgres hay MSSQL.
Rz Mk

1
Điều này sẽ tăng id tự động tăng, ngay cả khi bản ghi không được chèn hoặc cập nhật
Timo Huovinen

15

trong trường hợp của tôi, tôi phải cập nhật các bản ghi lớn hơn 1000, vì điều này thay vì nhấn truy vấn cập nhật mỗi lần tôi thích điều này,

   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 là Id người dùng và đối với id người dùng đó, tôi cần cập nhật cơ sở 999 và 88 tương ứng. Điều này hoạt động với tôi.


Một trong những điều tốt nhất ở đây, Làm việc tuyệt vời cho tôi.
Shahrukh Anwar

7

có lẽ đối với ai đó nó sẽ hữu ích

cho Postgresql 9.5 hoạt động như một cơ duyên

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 này cập nhật bản ghi hiện có và chèn nếu mới (2 trong 1)


1
Như tôi có thể thấy, id là pk cho bảng theo truy vấn của bạn. Giả sử có 2 hoặc nhiều cột được coi là pk (Khóa tổng hợp) ... Trong trường hợp đó, cách nào là đúng để kiểm tra xung đột.
Sritam Jagadev

6

Giải pháp của Camille đã làm việc. Biến nó thành một hàm PHP cơ bản, viết lên câu lệnh SQL. Hy vọng điều này sẽ giúp người khác.

    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

thay vì điều này

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

bạn có thể dùng

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

3

Thực thi mã bên dưới để cập nhật n số hàng, trong đó ID gốc là id bạn muốn lấy dữ liệu và Id con là id bạn cần được cập nhật, vì vậy bạn chỉ cần thêm id cha và id con để cập nhật tất cả các hàng bạn cần sử dụng một tập lệnh nhỏ.

    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

Giả sử bạn có danh sách các giá trị cần cập nhật trong bảng tính Excel với config_value trong cột A1config_name trong B1, bạn có thể dễ dàng viết truy vấn ở đó bằng công thức Excel như

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


1

Thực thi mã dưới đây nếu bạn muốn cập nhật tất cả bản ghi trong tất cả các cột:

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

và nếu bạn muốn cập nhật tất cả các cột của một hàng cụ thể thì thực hiện mã bên dưới:

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

3
Nếu giá trị khác nhau trong hàng khác nhau thì sao? ví dụ CẬP NHẬT nhân viên SET lương = 1125 WHERE name = 'Bob'; CẬP NHẬT nhân viên SET lương = 1200 WHERE name = 'Jane'; CẬP NHẬT nhân viên SET lương = 1100 WHERE name = 'Frank'; CẬP NHẬT nhân viên SET lương = 1175 WHERE tên = 'Susan'; CẬP NHẬT nhân viên SET lương = 1150 WHERE tên = 'John';
Abdullah Nurum
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.