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

未使用のシーケンスを削除するにはどうすればよいですか?

    まず、シリアル列に対して自動的に作成されたシーケンスは、自動的に削除されます。 、列(またはその列が含まれるテーブル)が削除されたとき。あなたが説明する問題は、そもそも存在すべきではありません。 非常にのみ 古いバージョンの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.
    


    1. MySqlデータベースの自動インクリメント値をJPAでリセットする

    2. Postgres:オフセット/制限のある副選択でパフォーマンスが非常に悪いのはなぜですか

    3. PostgreSQLでのDiv()のしくみ

    4. SQL-1つのクエリで複数のレコードを更新します