sql >> データベース >  >> RDS >> PostgreSQL

エラー:Postgresで複数の所有シーケンスが見つかりました

    更新: このバグは、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列が希望どおりに動作するはずです。



    1. 文字列で数値順に並べる

    2. パフォーマンスの神話:クラスター化インデックスと非クラスター化インデックス

    3. MySQLODBC5.1セット名はドライバーで許可されていません

    4. 未定義のクラス定数'MYSQL_ATTR_INIT_COMMAND'の未定義のクラス定数(PHP 5.5.3)