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
(oderint2
/int8
bzw. fürsmallserial
/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
verwendenALTER 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.