まず、シリアル列に対して自動的に作成されたシーケンスは、自動的に削除されます。 、列(またはその列が含まれるテーブル)が削除されたとき。あなたが説明する問題は、そもそも存在すべきではありません。 非常にのみ 古いバージョンのPostgreSQLはそれを行いませんでした。 7.4以上?
問題の解決策:
このクエリは、すべての「バインドされていない」シーケンスを削除するDDLコマンドを生成します データベースでは、次の場所で実行されます:
SELECT string_agg('DROP SEQUENCE ' || c.oid::regclass, '; ') || ';' AS ddl
FROM pg_class c
LEFT JOIN pg_depend d ON d.refobjid = c.oid
AND d.deptype <> 'i'
WHERE c.relkind = 'S'
AND d.refobjid IS NULL;
regclass
へのキャスト c.oid::regclass
内 現在のsearch_path
に従って、必要に応じてシーケンス名を自動的にスキーマ修飾します 。参照:
結果:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
結果を実行して、シリアル列(または他の列)にバインドされていないすべてのシーケンスを削除します。 ここで列とテーブルの意味 を調べてください。 。
注意 けれど! ありません これらのシーケンスが他の方法で使用されていないことを意味します。シーケンスがスタンドアロンオブジェクトとして作成されるユースケースは多数あります。たとえば、複数の列で1つのシーケンスを共有する場合です。自分が何をしているのかを正確に知る必要があります。
ただし、できません serial
にバインドされているシーケンスを削除します このように列を作成します。したがって、これでの操作は安全です。 尊重します。
DROP SEQUENCE test_id_seq
結果:
ERROR: cannot drop sequence test_id_seq because other objects depend on it
DETAIL: default for table test column id depends on sequence test_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.