PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Benennen Sie Tabellen mit seriellen Primärschlüsselspalten sicher um

serial ist kein eigentlicher Datentyp. Im Handbuch heißt es:

Die Datentypen smallserial , serial und bigserial sind keine echten Typen, sondern lediglich eine Notationshilfe zum Erstellen eindeutiger Bezeichnerspalten

Der Pseudo-Datentyp wird dabei aufgelöst:

  • Erstellen Sie eine Sequenz mit dem Namen tablename_colname_seq

  • Erstellen Sie die Spalte mit dem Typ integer (oder int2 / int8 bzw. für smallserial / bigserial )

  • Machen Sie die Spalte zu NOT NULL DEFAULT nextval('tablename_colname_seq')

  • der Spalte die Sequenz zu eigen machen, damit sie automatisch mit ihr gelöscht wird

Das System nicht wissen, ob Sie das alles von Hand oder über den Pseudo-Datentyp serial gemacht haben . pgAdmin überprüft die aufgeführten Merkmale und wenn alle erfüllt sind, wird das zurückentwickelte DDL-Skript mit dem passenden serial vereinfacht Typ. Ist eines der Merkmale nicht erfüllt, findet diese Vereinfachung nicht statt. Das macht pgAdmin. Für die zugrunde liegenden Katalogtabellen gilt dasselbe. Es gibt keine serial als solches eingeben.

Es gibt keine Möglichkeit, im Besitz befindliche Sequenzen automatisch umzubenennen. Sie können Folgendes ausführen:

ALTER SEQUENCE ... RENAME TO ...

wie du es getan hast. Das System selbst kümmert sich nicht um den Namen . Die Spalte DEFAULT speichert eine OID ('foo_pkey_seq'::regclass ), können Sie den Namen der Sequenz ändern, ohne das zu beschädigen - die OID bleibt gleich. Dasselbe gilt für Fremdschlüssel und ähnliche Verweise innerhalb der Datenbank.

Der implizite Index für den Primärschlüssel ist an den Namen der PK-Einschränkung gebunden, was nicht wird ändern, wenn Sie den Namen der Tabelle ändern. In Postgres 9.2 oder höher können Sie

verwenden
ALTER TABLE ... RENAME CONSTRAINT ..

auch das zu korrigieren.

Es kann auch Indizes geben, die in Bezug auf den Tabellennamen benannt sind. Ähnliches Verfahren:

ALTER INDEX .. RENAME TO  ..

Sie können alle Arten von informellen Verweisen auf den Tabellennamen haben. Das System kann Objekte, die beliebig benannt werden können, nicht zwangsweise umbenennen. Und es ist ihm egal.

Natürlich möchten Sie den SQL-Code, der auf diese Namen verweist, nicht ungültig machen. Offensichtlich möchten Sie Namen nicht ändern, während die Anwendungslogik auf sie verweist. Normalerweise wäre dies kein Problem für Namen von Indizes, Sequenzen oder Constraints, da diese normalerweise nicht namentlich referenziert werden.

Postgres erwirbt auch eine Sperre für Objekte, bevor es sie umbenennt. Also, wenn es gleichzeitige Transaktionen gibt öffnen, die irgendeine Art von Sperre für fragliche Objekte haben, Ihr RENAME Der Vorgang wird angehalten, bis diese Transaktionen festgeschrieben oder rückgängig gemacht werden.

Systemkataloge und OIDs

Das Datenbankschema wird in Tabellen des Systemkatalogs im Systemschema pg_catalog gespeichert . Alle Details im Handbuch hier. Wenn Sie nicht genau wissen, was Sie tun, sollten Sie überhaupt nicht mit diesen Tabellen herumspielen . Eine falsche Bewegung und Sie können Ihre Datenbank beschädigen. Verwenden Sie die DDL-Befehle, die Postgres bereitstellt.

Für einige der wichtigsten Tabellen stellt Postgres Objektbezeichnertypen und Typumwandlungen bereit, um den Namen für die OID und umgekehrt schnell zu erhalten. Wie:

SELECT 'foo_pkey_seq'::regclass

Wenn sich der Schemaname im search_path befindet und der Tabellenname ist eindeutig, das ergibt dasselbe wie:

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

Der Primärschlüssel der meisten Katalogtabellen ist oid und intern verwenden die meisten Referenzen OIDs.