Hallo,
in meinem Projekt habe habe ich hunderte von Tabellen, die dynamisch erstellt werden.
So weit so gut.
Jetzt läuft ein Cronjob, der Pl/PgSQL Funktion startet, die bei bestimmten Bedingungen eine Kopie (nur exact gleiche Struktur ohne Daten) von allen vorhandenen Tabellen erstellen soll.
Z.B. es gibt Tabellen: x01, x02, x03, …
Es sollen automatsch: y01, y02, y03, …
erstellt werden. Falls beim nächsten Durchlauf des Cronjobs schon bestimmte Tabellen vorhanden sind, sollen die natürlich nicht überschrieben werden (z.B. falls y02 schon existiert, soll die übersprungen werden.)
Wie stelle ich das am geschicktlichsten an ?
Also meine Vorgehensweise ist bis jetzt folgende:
a) in der “public” Schema information_schema.tables nachschauen, welche Tabellen es schon gibt
b) nur die x* tabellen in der Schleife durchlaufen
c) in der Schleife: falls y* mit der Nummer nicht existiert, ausführen:
“CREATE TABLE tablename_y ( LIKE tablename_x INCLUDING DEFAULTS )”
[font=monospace]
[/font]DECLARE
referrer_key RECORD;
tablename_x varchar(256);
tablename_y varchar(256);
rows_num integer;
BEGIN
FOR referrer_key IN SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' LOOP
-- alle andere tabellen ausser die mit 'x' anfangen überspringen
CONTINUE WHEN position('x' in referrer_key.table_name <> 1;
tablename_x := referrer_key.table_name;
tablename_y := 'y' || substring(tablename_x from 2);
SELECT count(table_name) INTO rows_num FROM information_schema.tables WHERE table_schema = 'public' AND table_name = tablename_y LIMIT 1;
IF (rows_num = 0) THEN
EXECUTE 'CREATE TABLE "' || tablename_y || '" ( LIKE "' || tablename_x || '" INCLUDING DEFAULTS )';
END IF;
END LOOP;
END;
Probleme:
-
muss man prüfen, ob die Tabelle y* existiert oder besser so was ähnliches,
wie CREATE TABLE IF NOT EXISTS … (gibt es das ?), dann ersparre ich mir ein IF (Geschwindigkeit?) -
bei dem
“CREATE TABLE tablename_y ( LIKE tablename_x INCLUDING DEFAULTS )”
wird zwar eine neue Tabelle mit der gleichen Struktur erstellt,
aber die Sequenze wird von beiden Tabellen eine und die selbe benutzt.
Das heisst, wenn ich einen Datensatz in die x/y Tabelle einfüge wird bei dem Gegenstück y/x der Counter auch erhöht.
Wie kann ich den CREATE TABLE Statement richtig aufbauen, damit die neue Tabelle eine eigene Sequenz bekommt ?
PS: ich arbeite mit PostgreSQL 8.1.23