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

LỖI:tìm thấy nhiều chuỗi được sở hữu trong Postgres

Cập nhật: Lỗi này đã được sửa trong PostgreSQL v12 với commit 19781729f78 .
Phần còn lại của câu trả lời phù hợp với các phiên bản cũ hơn.

Một serial cột có một trình tự thuộc sở hữu của cột và một DEFAULT giá trị nhận giá trị chuỗi ròng.

Nếu bạn cố gắng thay đổi cột đó thành cột nhận dạng, bạn sẽ gặp lỗi rằng đã có giá trị mặc định cho cột.

Bây giờ bạn phải bỏ giá trị mặc định, nhưng không phải là chuỗi thuộc về serial cột. Sau đó, khi bạn chuyển đổi cột này thành cột nhận dạng, chuỗi thứ hai thuộc sở hữu của cột đã được tạo.

Bây giờ khi bạn cố gắng chèn một hàng, PostgreSQL sẽ cố gắng tìm và sử dụng the trình tự thuộc sở hữu của cột, nhưng có hai, do đó có thông báo lỗi.

Tôi tranh luận rằng đây là một lỗi trong PostgreSQL:theo ý kiến ​​của tôi, nó nên định vị lại chuỗi hiện có cho cột nhận dạng hoặc cho bạn một lỗi rằng đã có một chuỗi thuộc sở hữu của cột và bạn nên loại bỏ nó. Tôi sẽ cố gắng sửa lỗi này .

Trong khi đó, bạn nên loại bỏ trình tự còn lại từ serial theo cách thủ công column.Run truy vấn sau:

SELECT d.objid::regclass
FROM pg_depend AS d
   JOIN pg_attribute AS a ON d.refobjid = a.attrelid AND
                             d.refobjsubid = a.attnum
WHERE d.classid = 'pg_class'::regclass
  AND d.refclassid = 'pg_class'::regclass
  AND d.deptype <> 'i'
  AND a.attname = 'patientid'
  AND d.refobjid = 'patient'::regclass;

Điều đó sẽ cung cấp cho bạn tên của chuỗi bị bỏ lại từ serial cột. Thả nó xuống và cột nhận dạng sẽ hoạt động như mong muốn.



  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ấy tên bảng nguồn của hàng khi truy vấn giá trị gốc mà hàng đó kế thừa

  2. Các hợp tác mạnh mẽ hơn với hỗ trợ ICU trong PostgreSQL 10

  3. PostgreSQL:giữa với datetime

  4. Lỗi phát sinh trong postgreSQL

  5. Làm cách nào để thực thi SQL thô trong quá trình di chuyển django