Cập nhật tất cả các cột từ bảng khác


13

Tôi cần cập nhật một bảng từ một bảng khác và tôi cần cập nhật tất cả các cột. Bên cạnh việc liệt kê mỗi cột trong SETmệnh đề, có cách nào để cập nhật tất cả chúng cùng một lúc không? Như thế này:

update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id

Tôi đã thử trong psql, nó không hoạt động. Tôi phải liệt kê mỗi cột như thế này:

update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id

tableBđược tạo ra sử dụng create .. like tableA. Vì vậy, chúng là cơ bản giống hệt nhau. Và lý do tôi đang làm là vì tôi cần tải dữ liệu .csv vào bảng tạm thời tableBvà sau đó cập nhật tableAdựa trên dữ liệu mới tableB. tableAcần phải được khóa càng ít càng tốt và tableAcần giữ tính toàn vẹn. Tôi không chắc chắn 'xóa rồi chèn' sẽ là một lựa chọn tốt?


1
Tôi đã thử nghiệm với mã thứ hai của bạn, nó hoạt động! Bạn nên xem lại hai vấn đề: dba.stackexchange.com/questions/58371/... , dba.stackexchange.com/questions/59458/...
Luận Huỳnh

Câu trả lời:


12

Không biến thể cú pháp cho phép bạn cập nhật toàn bộ hàng cùng một lúc. Tuy nhiên, có một hình thức ngắn hơn so với những gì bạn có cho đến nay.

Ngoài ra, bạn không thực sự muốn cập nhật tất cả các cột. Điều WHEREkiện trên các chân id giảm ít nhất một cột ( id) để không thay đổi. Nhưng đó chỉ là nitpicking.

UPDATE table_a a
SET    (  c1,   c2, ...)
     = (b.c1, b.c2, ...)
FROM   table_b b
WHERE  a.id = b.id;

Thêm chi tiết trong câu trả lời liên quan này:
Cập nhật hàng loạt tất cả các cột

DELETE / INSERT

Trong nội bộ, do mô hình MVCC của Postgres , mọi UPDATEcách đều có hiệu quả chèn một hàng mới và đánh dấu hàng cũ là lỗi thời. Vì vậy, đằng sau màn cửa không có nhiều sự khác biệt giữa UPDATEDELETEcộng INSERT.
một số chi tiết có lợi cho UPDATEtuyến đường:

  • CẬP NHẬT HẤP DẪN.
  • Các bảng TOAST: Nếu bạn có các cột lớn, nội dung có thể được lưu trữ. "Ngoài dòng" trong các bảng TOAST và phiên bản hàng mới có thể liên kết đến cùng một hàng trong bảng TOAST nếu các cột được nướng không thay đổi.
  • Chỉ số bảo trì có thể rẻ hơn để cập nhật.

Nếu không, khóa nên giống nhau. Bạn cần một khóa độc quyền trên các hàng bị ảnh hưởng theo cách nào. Chỉ cần làm cho nó nhanh chóng.
Nếu bạn đang xử lý một số lượng lớn các hàng và bạn không cần một trạng thái nhất quán (tất cả các hàng hoặc không có), bạn có thể chia hoạt động thành nhiều đợt. (Giao dịch riêng!) Tăng tổng chi phí, nhưng giữ thời gian khóa trên mỗi hàng ngắn hơn.


3
DELETE / INSERTcũng có thể có các hiệu ứng không mong muốn hoặc chỉ khác nhau (tầng hoặc kích hoạt) so với UPDATE.
ypercubeᵀᴹ

Nó là chính xác nhưng bạn nên cập nhật một phần bí danh của bảng_a. table_a (được cập nhật bảng) không thể lấy bí danh.
Chỉ cần một người yêu mã khác
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.