sql >> Database >  >> RDS >> PostgreSQL

Hoe ongebruikte sequenties verwijderen?

Ten eerste wordt een reeks die automatisch wordt gemaakt voor een seriële kolom automatisch verwijderd , wanneer de kolom (of tabel waarin deze zich bevindt) wordt verwijderd. Het probleem dat u beschrijft, zou om te beginnen niet moeten bestaan. Alleen zeer oude versies van PostgreSQL deden dat niet. 7.4 of ouder?

Oplossing voor het probleem:

Deze query genereert de DDL-commando's om alle "niet-gebonden" reeksen te verwijderen in de database wordt het uitgevoerd in:

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;

De cast naar regclass in c.oid::regclass automatisch schema-kwalificeert reeksnamen waar nodig volgens het huidige search_path . Zie:

Resultaat:

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...

Voer het resultaat uit om alle reeksen te verwijderen die niet zijn gebonden aan een seriële kolom (of een andere kolom). Bestudeer de betekenis van kolommen en tabellen hier .

Voorzichtig hoewel! Het doet niet betekenen dat die sequenties anders niet in gebruik zijn. Er zijn een aantal gebruikssituaties waarbij sequenties worden gemaakt als op zichzelf staande objecten. Bijvoorbeeld als u wilt dat meerdere kolommen één reeks delen. Je zou precies moeten weten wat je doet.

U kunt echter niet verwijder reeksen gebonden aan een serial kolom op deze manier. Dus de operatie is veilig in dit respect.

DROP SEQUENCE test_id_seq

Resultaat:

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. (My)SQL JOIN - krijg teams met exact gespecificeerde leden

  2. Toegang tot URL-parameters in Oracle Forms / OC4J

  3. Een 32-bits applicatie verbinden met jBASE

  4. Hoe een grote tabel met miljoenen rijen in SQL Server bij te werken?