Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: [pgsql] CREATE TABLE ... INHERITS ...

W PostgreSQL
CREATE TABLE t1 () INHERITS (t2)
tworzy tabelę t1 o takiej samej strukturze jak t2. W dokumentacji jest napisane: "by default the data of the child table is included in scans of the parent(s)", co sugeruje, że można wyłączyć tę funkcjonalność - zależy mi tylko na automatycznym powielaniu struktury, zaś dołączanie zawartości t1 przy skanowaniu t2 przeszkadza mi. Jak to zrobić?

Dodatkowo chciałbym w t1 dodać kolumnę, ale na początku, przed kolumnami z t2, a domyślnie jak zdefiniuję jakąś kolumnę w nawiasach, to ląduje ona na końcu, zaś potem jak dodam kolumnę w t2, to ląduje ona jeszcze dalej. Da się?Paweł Koralewski edytował(a) ten post dnia 22.11.11 o godzinie 09:38
Robert Suski

Robert Suski Sr Solutions
Developer

Temat: [pgsql] CREATE TABLE ... INHERITS ...

To może lepiej użyć klauzuli LIKE w poleceniu CREATE TABLE
http://www.postgresql.org/docs/8.1/static/sql-createta...
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: [pgsql] CREATE TABLE ... INHERITS ...

LIKE tworzy jednorazowo kopię kolumn, w momencie tworzenia tabeli. Jeśli tabela źródłowa t1 się zmieni, to t2 już nie.
Robert Suski

Robert Suski Sr Solutions
Developer

Temat: [pgsql] CREATE TABLE ... INHERITS ...

No to jesli chodzi o skanowanie to może

SELECT * FROM ONLY T2;
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: [pgsql] CREATE TABLE ... INHERITS ...

Robert Suski:
SELECT * FROM ONLY T2;

Raczej
SELECT * FROM ONLY t1
i to działa :)
A coś jeszcze z tą kolumną, aby nowe kolumny w t2 były przed tymi dziedziczonymi po t1?

konto usunięte

Temat: [pgsql] CREATE TABLE ... INHERITS ...

To że kolumna jest na końcu to ma dla Ciebie jakikolwiek wpływ? Ja w manualu takiej opcji nie widziałem. Możesz spróbować ALTER TABLE, ale w manualu piszą że nie wszystkie wariacje działają.
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: [pgsql] CREATE TABLE ... INHERITS ...

Tak, ma dla mnie znacznie, bo chcę wykonać później kwerendy w stylu
INSERT INTO t2 
SELECT jakas_wartosc_nowej_kolumny, t1.* FROM t1 WHERE t1.id=jakas_wartosc

bez wymieniania kolumn.Paweł Koralewski edytował(a) ten post dnia 23.11.11 o godzinie 09:46

konto usunięte

Temat: [pgsql] CREATE TABLE ... INHERITS ...

A jak wrzucasz do tabelki dane, które mają dostać coś z defaulta - np. id to co robisz?
INSERT INTO t2(....)
W miejsce kropek trzeba podać zestaw kolumn, które są określone w SELECT.
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: [pgsql] CREATE TABLE ... INHERITS ...

Michał Z.:
A jak wrzucasz do tabelki dane, które mają dostać coś z defaulta - np. id to co robisz?
INSERT INTO t2(....)
W miejsce kropek trzeba podać zestaw kolumn, które są określone w SELECT.

Jak mam jakieś dodatkowe kolumny w t2 w stosunku do t1, to oczywiście muszę podać dla nich wartości przy korzystaniu z INSERT INTO t2 (). Natomiast te kolumny, które się powielają (są odziedziczone), uzupełniam przez *. Wiem, mogę wymienić wszystkie kolumny ręcznie i będzie działać, jednak chciałbym zrobić mechanizm, ustawić go i zapomnieć, aby nie mieć obawy, że przy zmianie struktury t1 przestanie mi działać jakaś kwerenda albo kopiowane dane będą niekompletne.
Robert Suski

Robert Suski Sr Solutions
Developer

Temat: [pgsql] CREATE TABLE ... INHERITS ...


jednak chciałbym zrobić mechanizm, ustawić go i zapomnieć, aby nie mieć obawy, że przy zmianie struktury t1 przestanie mi działać jakaś kwerenda albo kopiowane dane będą niekompletne.

Takie generyczne skrypty to niestety najczęściej źródło problemów,
ale jeśli już musisz coś takiego mieć to proponuję zrobić procedurę do aktualizacji danych i w tej procedurze budować dynamicznie listę kolumn dla INSERTA za pomocą danych zawartych w information_schema (pobierasz kolumny jakie są w obu tabelach i budujesz inserta).
Ale chciałbym zauważyć że to dość karkołomne rozwiązanie.

Następna dyskusja:

[pl/sql] Create if exists




Wyślij zaproszenie do