PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tham chiếu cột không rõ ràng trong INSERT ... ON CONFLICT DO UPDATE

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 dẫn:

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để nhập tệp JSON vào PostgreSQL?

  2. đếm các mục nhập rỗng trong cột cơ sở dữ liệu theo cách RESTfull

  3. Cách thêm mô-đun vào Wildfly bằng CLI

  4. Tại sao mục trình tự Postgres vẫn tăng lên ngay cả khi việc tạo đối tượng không thành công?

  5. PGAdmin III không thể kết nối AWS RDS