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.