更新: このバグは、PostgreSQLv12でcommitで修正されています。 19781729f78
。
残りの回答は古いバージョンに関連しています。
serial
列には、列が所有するシーケンスとDEFAULT
があります ネットシーケンス値を取得する値。
その列をID列に変更しようとすると、その列のデフォルト値がすでに存在するというエラーが表示されます。
ここで、デフォルト値を削除したはずですが、serial
に属するシーケンスは削除していません。 桁。次に、列をID列に変換すると、その列が所有する2番目のシーケンスが作成されました。
これで、行を挿入しようとすると、PostgreSQLはを見つけて使用しようとします。 列が所有するシーケンスですが、2つあるため、エラーメッセージが表示されます。
これはPostgreSQLのバグであると私は主張します。私の意見では、ID列の既存のシーケンスを再利用するか、列が所有するシーケンスがすでに存在するというエラーが表示されたため、削除する必要があります。 このバグを修正しようとします 。
その間、serial
から残されたシーケンスを手動で削除する必要があります column。次のクエリを実行します:
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;
これで、serial
から残されたシーケンスの名前がわかります。 桁。ドロップすると、ID列が希望どおりに動作するはずです。