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: