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

  1. Warum haben die DEFAULT nextval('foo_pkey_seq'::regclass) Erklärung auftauchen und wieder verschwinden?
  2. Gibt es eine Möglichkeit, die Tabelle umbenennen und haben die primary key-Sequenz umbenannt in der gleichen Zeit?
  3. Ist es sicher, die Tabelle umbenennen, dann Sequenz, während die clients mit der Datenbank verbunden sind, gibt es concurrency-Probleme?
  4. 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?
  5. Was über die implizite index-erstellt einen Primärschlüssel? Soll das umbenannt werden? Wenn ja, wie geht das?
  6. 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.
InformationsquelleAutor ams | 2013-02-01
Schreibe einen Kommentar