sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur tar man bort oanvända sekvenser?

För det första, en sekvens som skapas automatiskt för en seriell kolumn raderas automatiskt , när kolumnen (eller tabellen den finns i) tas bort. Problemet du beskriver borde inte existera till att börja med. Bara mycket gamla versioner av PostgreSQL gjorde inte det. 7.4 eller äldre?

Lösning för problemet:

Den här frågan genererar DDL-kommandon för att ta bort alla "obundna" sekvenser i databasen körs det i:

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;

Casten till regclass i c.oid::regclass schemakvalificerar automatiskt sekvensnamn vid behov enligt den aktuella search_path . Se:

Resultat:

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...

Kör resultatet för att ta bort alla sekvenser som inte är bundna till en seriell kolumn (eller någon annan kolumn). Studera innebörden av kolumner och tabeller här .

Försiktig fastän! Det gör det inte betyder att de sekvenserna inte används annars. Det finns ett antal användningsfall där sekvenser skapas som fristående objekt. Till exempel om du vill att flera kolumner ska dela en sekvens. Du bör veta exakt vad du gör.

Men du kan inte radera sekvenser bundna till en serial kolumn på detta sätt. Så operationen är säker i denna respekt.

DROP SEQUENCE test_id_seq

Resultat:

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. uppdatera kolumnvärdet efter infogning och tidsperiod

  2. Vilken typ skulle du mappa BigDecimal i Java/Hibernate i MySQL?

  3. flerdimensionell array-fråga mysql

  4. _gc_fusion_compression