Pembaruan: Bug ini telah diperbaiki di PostgreSQL v12 dengan komit 19781729f78
.
Jawaban lainnya relevan untuk versi yang lebih lama.
Sebuah serial
kolom memiliki urutan yang dimiliki oleh kolom dan DEFAULT
nilai yang mendapatkan nilai urutan bersih.
Jika Anda mencoba mengubah kolom tersebut menjadi kolom identitas, Anda akan mendapatkan pesan kesalahan bahwa sudah ada nilai default untuk kolom tersebut.
Sekarang Anda harus menjatuhkan nilai default, tetapi bukan urutan yang dimiliki serial
kolom. Kemudian ketika Anda mengubah kolom menjadi kolom identitas, urutan kedua yang dimiliki oleh kolom tersebut dibuat.
Sekarang ketika Anda mencoba menyisipkan baris, PostgreSQL mencoba menemukan dan menggunakan the urutan yang dimiliki oleh kolom, tetapi ada dua, maka pesan kesalahannya.
Saya berpendapat bahwa ini adalah bug di PostgreSQL:menurut pendapat saya, itu seharusnya mengubah urutan yang ada untuk kolom identitas atau memberi Anda kesalahan bahwa sudah ada urutan yang dimiliki oleh kolom, dan Anda harus menjatuhkannya. Saya akan mencoba memperbaiki bug ini .
Sementara itu, Anda harus secara manual menghapus urutan yang tertinggal dari serial
kolom.Jalankan kueri berikut:
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;
Itu akan memberi Anda nama urutan yang tertinggal dari serial
kolom. Jatuhkan, dan kolom identitas akan berperilaku seperti yang diinginkan.