Sicher umbenennen von Tabellen mithilfe von serial primary key-Spalten
Ich weiß, dass der PostgreSQL-Tabellen, die mit einem SERIAL
primary key am Ende mit einem impliziten index, Sequenz-und constraint erstellt wird, die von PostgreSQL. Die Frage ist, wie benennen Sie diese impliziten Objekte, wenn die Tabelle umbenannt wird. Unten ist mein Versuch herauszufinden diese bei konkreten Fragen am Ende.
Tabelle wie:
CREATE TABLE foo (
pkey SERIAL PRIMARY KEY,
value INTEGER
);
Postgres-Ausgänge:
NOTICE: CREATE TABLE will create implicit sequence "foo_pkey_seq" für serial-Spalte "foo".pkey"
HINWEIS: CREATE TABLE /PRIMARY KEY will create implicit index "foo_pkey" für die Tabelle "foo"
Abfrage erfolgreich mit kein Ergebnis in 52 ms.
pgAdmin III SQL-Bereich zeigt die folgenden DDL-Skript für die Tabelle (decluttered):
CREATE TABLE foo (
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE foo OWNER TO postgres;
Nun benennen Sie die Tabelle:
ALTER table foo RENAME TO bar;
Abfrage erfolgreich mit kein Ergebnis in 17 ms.
pgAdmin III:
CREATE TABLE bar (
pkey integer NOT NULL DEFAULT nextval('foo_pkey_seq'::regclass),
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
Beachten Sie die zusätzlichen DEFAULT nextval('foo_pkey_seq'::regclass),
dies bedeutet, dass die Umbenennung der Tabelle nicht umbenennen, die Reihenfolge der Primärschlüssel aber jetzt haben wir diese explizite nextval()
.
Nun benennen Sie die Sequenz:
Ich will, dass die Datenbank die Benennung konsistent, so habe ich versucht:
ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;
Abfrage erfolgreich mit kein Ergebnis in 17 ms.
pgAdmin III:
CREATE TABLE bar (
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
Den DEFAULT nextval('foo_pkey_seq'::regclass),
ist Weg.
FRAGEN
- Warum haben die
DEFAULT nextval('foo_pkey_seq'::regclass)
Erklärung auftauchen und wieder verschwinden? - Gibt es eine Möglichkeit, die Tabelle umbenennen und haben die primary key-Sequenz umbenannt in der gleichen Zeit?
- Ist es sicher, die Tabelle umbenennen, dann Sequenz, während die clients mit der Datenbank verbunden sind, gibt es concurrency-Probleme?
- Wie funktioniert postgres wissen, welche Sequenz? Gibt es einen Datenbank-trigger wird intern verwendet? Gibt es sonst noch etwas zu benennen, andere als die Tabelle und die Reihenfolge?
- Was über die implizite index-erstellt einen Primärschlüssel? Soll das umbenannt werden? Wenn ja, wie geht das?
- Was über die constraint-name oben? Es ist noch
foo_pkey
. Wie ist eine Einschränkung umbenannt?
- Meine Vermutung wäre, dass die Benennung einer Sequenz
<<tablename>>_pkey_seq
hat Magische syntaktische Bedeutung, und dass Postgres kennt die Verwendung einer so genannten Reihenfolge als Primärschlüssel einer Tabelle Abfolge und weglassen explizit die Auflistung als der Standard-Wert von einer Tabelle primary key-Spalte. Ich weiß wirklich nicht, dies oder haben Sie irgendwelche Beweise dafür, aber. Wird weiter zu untersuchen, nach der Arbeit, wenn diese Frage nicht eine Antwort haben, dann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
serial
ist nicht eine tatsächliche Datentyp. In der Anleitung steht:Den pseudo-Datentyp gelöst wird all dies tun:
erstellen Sie eine Sequenz mit dem Namen
tablename_colname_seq
erstellen Sie die Spalte mit Typ
integer
(oderint2
/int8
bzw. fürsmallserial
/bigserial
)machen Sie die Spalte
NOT NULL DEFAULT nextval('tablename_colname_seq')
machen der eigenen Spalte die Reihenfolge, so, es wird gelöscht und es wird automatisch
Tut das system nicht wissen, ob Sie haben dies alles von hand oder durch die Art und Weise der pseudo-Datentyp
serial
. pgAdmin Kontrollen auf die aufgeführten Eigenschaften, und wenn alle erfüllt sind, wird der reverse-Engineering-DDL-Skript vereinfacht mit dem passendenserial
geben. Wenn eines der Merkmale nicht erfüllt ist, ist diese Vereinfachung findet nicht statt. Das ist etwas, pgAdmin hat. Für den zugrunde liegenden katalogtabellen es ist alles das gleiche. Es gibt keineserial
geben Sie als solche.Gibt es keine Möglichkeit, automatisch umbenennen, die sich im Besitz Sequenzen. Können Sie ausführen:
wie Sie es getan haben. Das system selbst kümmert sich nicht um die Namen. Die Spalte
DEFAULT
speichert eineOID
('foo_pkey_seq'::regclass
), Sie können ändern Sie den Namen der Sequenz, ohne zu brechen, dass die OID bleibt die gleiche. Das gleiche gilt für Fremdschlüssel und ähnliche Referenzen) in der Datenbank.Die implizite index für den Primärschlüssel ist gebunden an den Namen des PK-Einschränkung, die nicht ändern, wenn Sie ändern Sie den Namen der Tabelle. In Postgres 9.2 oder höher, die Sie verwenden können
zu berichtigen, zu.
Gibt es auch Indizes genannt, in Anspielung auf den Namen der Tabelle. Ähnliche Verfahren:
Können Sie alle Arten von informellen Verweise auf die Tabelle Namen. Das system kann nicht zwangsweise umbenennen Objekte, die benannt werden können, was Sie wollen. Und es ist ihm egal.
Natürlich Sie nicht wollen, zu entkräften SQL-code, die Verweise mit diesen Namen. Offensichtlich wollen Sie nicht Namen ändern, während die Anwendung der Logik die Sie verweist. Normalerweise wäre dies nicht ein problem für die Namen der Indizes, Sequenzen oder-Einschränkungen, da die in der Regel nicht mit Ihrem Namen verwiesen wird.
Postgres auch eine Sperre auf Objekte vor der Umbenennung. Also, wenn es gleichzeitige Transaktion öffnen, dass jede Art von sperren auf Objekten in Frage, Ihre
RENAME
Betrieb angehalten wird, bis alle Transaktionen, die ein commit-oder Rollback.System Kataloge und OIDs
Den Datenbank-schema gespeichert ist in den Tabellen des Systemkatalogs, in dem system-schema
pg_catalog
. Alle Angaben in der Anleitung hier. Wenn Sie nicht genau wissen, was Sie tun, sollte man nicht spaßen mit diesen Tabellen überhaupt. Eine falsche Bewegung und Sie können brechen die Datenbank. Verwenden Sie die DDL-Befehle Postgres bietet.Für einige der wichtigsten Tabellen Postgres bietet Objekt-Identifikator-Typen und Typumwandlungen, um den Namen für die OID und Umgekehrt schnell. Wie:
Wenn der Schemaname in der
search_path
und der name der Tabelle ist einzigartig, das gibt Ihnen das gleiche wie:Den Primärschlüssel der meisten Katalog-Tabellen ist
oid
- und intern, die meisten Verweise verwenden OIDs.