'Tham chiếu cột không rõ ràng' khi đưa phần tử vào bảng


15

Tôi đang sử dụng PostgreSQL làm cơ sở dữ liệu của mình. Và tôi cần tạo một mục trong cơ sở dữ liệu và nếu nó đã tồn tại, chỉ cần cập nhật các trường của nó, nhưng một trong các trường chỉ nên được cập nhật nếu nó không được đặt.

Tôi đã sử dụng thông tin từ câu hỏi này: /programming/13305878/dont-update-column-if-update-value-is-null , nó hoàn toàn liên quan đến những gì tôi có.

Tôi đã cố gắng sử dụng truy vấn này, nhưng khi tôi chạy nó, nó báo lỗi Column reference 'affiliate_code' is ambiguous:

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(affiliate_code, value3);

(tất nhiên giá trị thực được thay thế).

Nếu tôi thay thế affiliate_code = COALESCE(affiliate_code, value3)với affiliate_code = value3, mọi thứ suôn sẻ, nhưng không phải theo cách tôi muốn nó làm việc.

Làm thế nào tôi có thể làm cho công việc này?

Đây là cách bảng của tôi được định nghĩa:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);

4
Hãy thử = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Câu trả lời:


15

Từ các tài liệu,

Xung đột_ chỉ định một hành động thay thế TRÊN CONFLICT. Nó có thể là KHÔNG NÊN, hoặc một mệnh đề DO CẬP NHẬT chỉ định chi tiết chính xác của hành động CẬP NHẬT sẽ được thực hiện trong trường hợp có xung đột. Các mệnh đề SET và WHERE trong ON CONFLICT DO UPDATE có quyền truy cập vào hàng hiện có bằng tên của bảng (hoặc bí danh) và đến các hàng được đề xuất để chèn bằng bảng loại trừ đặc biệt. Đặc quyền CHỌN được yêu cầu trên bất kỳ cột nào trong bảng đích nơi các cột loại trừ tương ứng được đọc.

Vì vậy, thay vào đó, hãy thử điều này trên mỗi ypercubeᵀᴹ

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(accounts.affiliate_code, excluded.affiliate_code);
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.