Bạn cần xác định bảng đủ điều kiện cho cột mà nếu không nó sẽ không rõ ràng.
Sử dụng tên bảng ảo excluded để tham chiếu đến hàng đầu vào. Nhưng bạn có thể muốn tham chiếu đến cột mục tiêu, vì vậy hãy đủ điều kiện với tên của bảng mục tiêu:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
Hàng đơn từ bảng nhập ảo excluded chứa tất cả các cột của bảng mục tiêu, ngay cả khi không được liệt kê trong danh sách cột mục tiêu của INSERT hoặc VALUES biểu hiện. Vì vậy, sự mơ hồ mà bạn gặp phải luôn ở đó, cho dù count được nhắm mục tiêu rõ ràng hay không.
Bên cạnh:Các cột bị bỏ qua trong danh sách cột mục tiêu được mặc định thành cột tương ứng của chúng DEFAULT giá trị, là NULL theo mặc định (NULL là cột mặc định DEFAULT ). Tức là, nó sẽ mặc định thành NULL trong thiết lập của bạn và 1 trong thiết lập cải tiến của tôi bên dưới. Và trình kích hoạt cấp hàng BEFORE INSERT (nếu có) được áp dụng.
Nhưng cả hai điều đó đều không áp dụng cho ví dụ vì nó đề cập đến target sau cùng.
Đáng chú ý, hai trường hợp khác của tên cột count rõ ràng (và do đó không yêu cầu tiêu chuẩn bảng) vì chúng chỉ có thể tham chiếu đến target bảng.
Thiết lập của bạn có thể dễ dàng bị hỏng khi cột count không được xác định NOT NULL , dưới dạng NULL + 1 vẫn là NULL . Thiết lập này sẽ có ý nghĩa hơn:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
Cũng không sử dụng các tên CaMeL-case được trích dẫn trong ví dụ của tôi. Xem: