
рд╣реИрд▓реЛ, habracheloveki! рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ,
PostgreSQL 9.3 рдХрд╛ рд╡рд┐рдореЛрдЪрди рд╣реБрдЖ рдерд╛ рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╡рд╛рдЪрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ:
- рднреМрддрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡
- рдЕрджреНрдпрддрди рд╡рд┐рдЪрд╛рд░
- рдШрдЯрдирд╛ рдЯреНрд░рд┐рдЧрд░
- рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡
- рдкрд╛рд░реНрд╢реНрд╡ рдкрд╛рд▓рди
- рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ
- JSON рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдФрд░ рдСрдкрд░реЗрдЯрд░
рднреМрддрд┐рдХрд╡рд╛рджреА рд╡рд┐рдЪрд╛рд░

рднреМрддрд┐рдХрд╡рд╛рджреА рджреГрд╢реНрдп рдПрдХ рднреМрддрд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВред рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рд╕рдмрд╕реЗ рдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐
PostgreSQL рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред
рд▓реЗрдЦрдХ рдХреА рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ рд▓реЗрдЦрдХ рдХреА рдПрдХ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХреЛрдВ рдХреА рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБ:
CREATE TABLE author ( id serial NOT NULL, first_name text NOT NULL, last_name text NOT NULL, CONSTRAINT pk_author_id PRIMARY KEY ( id ), CONSTRAINT uk_author_name UNIQUE ( first_name, last_name ) ); CREATE TABLE book ( id serial NOT NULL, author_id integer NOT NULL, name text NOT NULL, CONSTRAINT pk_book_id PRIMARY KEY ( id ), CONSTRAINT fk_book_author_id FOREIGN KEY ( author_id ) REFERENCES author ( id ), CONSTRAINT uk_book_name UNIQUE ( author_id, name ) );
рдЗрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдбреЗрдЯрд╛ рд╕реЗ рднрд░реЗрдВ - рд▓реЗрдЦрдХреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдХрдИ, рдХрдИ рдХрд┐рддрд╛рдмреЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ:
INSERT INTO author ( first_name, last_name ) VALUES ( '', '' );
рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдФрд░ рднреМрддрд┐рдХ рджреГрд╢реНрдп рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмрд╛рдж рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ):
CREATE VIEW vw_book AS SELECT book.id, author.first_name || ' ' || author.last_name AS author_name, book.name FROM book INNER JOIN author ON author.id = book.author_id; CREATE MATERIALIZED VIEW mvw_book AS SELECT book.id, author.first_name || ' ' || author.last_name AS author_name, book.name FROM book INNER JOIN author ON author.id = book.author_id;
рдЕрдм, рдПрдХ рдирд┐рдпрдорд┐рдд рдФрд░ рднреМрддрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
EXPLAIN ANALYZE SELECT * FROM vw_book WHERE author_name = ' ';
рднреМрддрд┐рдХрд╡рд╛рджреА рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рдвреЗрд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕реБрдзрд╛рд░:
CREATE INDEX idx_book_name ON mvw_book ( author_name ); EXPLAIN ANALYZE SELECT * FROM mvw_book WHERE author_name = ' ';
рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдЦреЛрдЬ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЦреЛрдЬ рд╕рдордп рдореЗрдВ рдХрд╛рдлреА рдХрдореА рдЖрдИ рд╣реИред
рд▓реЗрдХрд┐рди рднреМрддрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ - рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░
рдбреАрдПрдордПрд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рдж рдЬреЛ рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ, рджреГрд╢реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ:
INSERT INTO book ( author_id, name ) VALUES ( 2, ' ' ); REFRESH MATERIALIZED VIEW mvw_book;
рдЗрд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
CREATE OR REPLACE FUNCTION mvw_book_refresh ( ) RETURNS trigger AS $BODY$ BEGIN REFRESH MATERIALIZED VIEW mvw_book; RETURN NULL; END $BODY$ LANGUAGE plpgsql VOLATILE; CREATE TRIGGER tr_book_refresh AFTER INSERT OR UPDATE OR DELETE ON book FOR EACH STATEMENT EXECUTE PROCEDURE mvw_book_refresh ( ); CREATE TRIGGER tr_author_refresh AFTER INSERT OR UPDATE OR DELETE ON author FOR EACH STATEMENT EXECUTE PROCEDURE mvw_book_refresh ( );
рд╣рд╛рд▓рд╛рдБрдХрд┐
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реАрдХреНрдпреВ 9.2 рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдХрд░, рдЗрд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдХреЗ рдФрд░ рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдЬреЛ рдПрдХ рдХрдард┐рди рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛), рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╡рд╛рдЪрд╛рд░ рд╣реИред
рдЕрджреНрдпрддрд┐рдд рджреГрд╢реНрдп
рдбреАрдПрдордПрд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрджреНрдпрддрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЕрдзрд┐рдХ рд╣реИрдВ:
FROM рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ (рддрд╛рд▓рд┐рдХрд╛, рджреГрд╢реНрдп), рдмрд┐рдирд╛,
DISTINCT ,
GROUP BY ,
HAVING ,
LIMIT рдФрд░
OFFSET рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╕реЗрдЯ (
UNION ,
INTERSECT рдФрд░
EXCEPT ) рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд┐рдирд╛ред рдХреЛрдИ рдХрд╛рд░реНрдп рдпрд╛ рд╕рдВрдЪрд╛рд▓рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЕрджреНрдпрддрди рд╡рд┐рдЪрд╛рд░:
CREATE TABLE employee ( id serial NOT NULL, fullname text NOT NULL, birthday date, salary numeric NOT NULL DEFAULT 0.0, CONSTRAINT pk_employee_id PRIMARY KEY ( id ), CONSTRAINT uk_employee_fullname UNIQUE ( fullname ), CONSTRAINT ch_employee_salary CHECK ( salary >= 0.0 ) ); INSERT INTO employee ( fullname, salary ) VALUES ( ' ', 800.0 ); INSERT INTO employee ( fullname, salary ) VALUES ( ' ', 2000.0 ); INSERT INTO employee ( fullname, salary ) VALUES ( '', 1500.0 ); CREATE VIEW vw_employee_top_salary AS SELECT employee.fullname AS name, employee.salary FROM employee WHERE employee.salary >= 1000.0;
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
INSERT рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдФрд░
UPDATE рдФрд░
DELETE рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдЬрдм рдЖрдзрд╛рд░ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕реЗрдЯ рджреГрд╢реНрдп рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ:
INSERT INTO vw_employee_top_salary ( name, salary ) VALUES ( '', 0.0 );
рдкреНрд░рд╕реНрддреБрдд
рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЪреАрдЬреЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА
рд╣реИрдВ ред
рдЗрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╡рд╛рдЪрд╛рд░ред рдХрд┐рд╕реА DB рдореЗрдВ
DDL рдХрдорд╛рдВрдб рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рд╡реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЯреНрд░рд┐рдЧрд░реНрд╕ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛, рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕рдХреЛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реИред
рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛:
CREATE OR REPLACE FUNCTION event_trigger_begin ( ) RETURNS event_trigger AS $BODY$ BEGIN RAISE NOTICE '(begin) tg_event = %, tg_tag = %', TG_EVENT, TG_TAG; END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION event_trigger_end ( ) RETURNS event_trigger AS $BODY$ BEGIN RAISE NOTICE '(end) tg_event = %, tg_tag = %', TG_EVENT, TG_TAG; END; $BODY$ LANGUAGE plpgsql; CREATE EVENT TRIGGER tr_event_begin ON ddl_command_start EXECUTE PROCEDURE event_trigger_begin ( ); CREATE EVENT TRIGGER tr_event_end ON ddl_command_end EXECUTE PROCEDURE event_trigger_end ( );
рд╣рдо рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ
рдбреАрдбреАрдПрд▓- рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░рддреЗ рд╣реИрдВ:
CREATE TABLE article ( id SERIAL NOT NULL, name text NOT NULL, CONSTRAINT pk_article_id PRIMARY KEY ( id ), CONSTRAINT uk_article_name UNIQUE ( name ) ); ALTER TABLE article ADD COLUMN misc numeric; ALTER TABLE article ALTER COLUMN misc TYPE text; ALTER TABLE article DROP COLUMN misc; DROP TABLE article;
рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
tg_event = ddl_command_start, tg_tag = CREATE TABLE tg_event = ddl_command_end, tg_tag = CREATE TABLE tg_event = ddl_command_start, tg_tag = ALTER TABLE tg_event = ddl_command_end, tg_tag = ALTER TABLE tg_event = ddl_command_start, tg_tag = ALTER TABLE tg_event = ddl_command_end, tg_tag = ALTER TABLE tg_event = ddl_command_start, tg_tag = ALTER TABLE tg_event = ddl_command_end, tg_tag = ALTER TABLE tg_event = ddl_command_start, tg_tag = DROP TABLE tg_event = ddl_command_end, tg_tag = DROP TABLE
Plpgsql рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдХреЗрд╡рд▓ рдИрд╡реЗрдВрдЯ (
TG_EVENT ) рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯреАрдо (
TG_TAG ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рдЪрд╛рд░

рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡реЗ
RECURSIVE рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рднрд░реЗрдВ:
CREATE TABLE directory ( id serial NOT NULL, parent_id integer, name text NOT NULL, CONSTRAINT pk_directory_id PRIMARY KEY ( id ), CONSTRAINT fk_directory_parent_id FOREIGN KEY ( parent_id ) REFERENCES directory ( id ), CONSTRAINT uk_directory_name UNIQUE ( parent_id, name ) ); INSERT INTO directory ( parent_id, name ) VALUES ( NULL, 'usr' );
рдкреБрдирд░рд╛рд╡рд░реНрддреА рдФрд░ рд╕рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рд╢реНрди:
WITH RECURSIVE vw_directory ( id, parent_id, name, path ) AS ( SELECT id, parent_id, name, '/' || name FROM directory WHERE parent_id IS NULL AND name = 'var' UNION ALL SELECT d.id, d.parent_id, d.name, t.path || '/' || d.name FROM directory d INNER JOIN vw_directory t ON d.parent_id = t.id ) SELECT * FROM vw_directory ORDER BY path; CREATE RECURSIVE VIEW vw_directory ( id, parent_id, name, path ) AS SELECT id, parent_id, name, '/' || name FROM directory WHERE parent_id IS NULL AND name = 'var' UNION ALL SELECT d.id, d.parent_id, d.name, t.path || '/' || d.name FROM directory d INNER JOIN vw_directory t ON d.parent_id = t.id; SELECT * FROM vw_directory ORDER BY path;
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рджреГрд╢реНрдп
RECURSIVE рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рдЬрд┐рд╕реЗ рдХреЗрдВрджреНрд░рд┐рдд рджреГрд╢реНрдп рдХреЗ рдкрд╛рда рдХреЛ рджреЗрдЦрдХрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
CREATE OR REPLACE VIEW vw_directory AS WITH RECURSIVE vw_directory(id, parent_id, name, path) AS ( SELECT directory.id, directory.parent_id, directory.name, '/'::text || directory.name FROM directory WHERE directory.parent_id IS NULL AND directory.name = 'var'::text UNION ALL SELECT d.id, d.parent_id, d.name, (t.path || '/'::text) || d.name FROM directory d JOIN vw_directory t ON d.parent_id = t.id ) SELECT vw_directory.id, vw_directory.parent_id, vw_directory.name, vw_directory.path FROM vw_directory;
рдкрд╛рд░реНрд╢реНрд╡ рдкрд╛рд▓рди

рдХрд┐рд╕реА рд╕рдмрдХреНрд╡реЗрд░реА рд╕реЗ рдмрд╛рд╣рд░реА рдХреНрд╡реЗрд░реА рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдЙрджрд╛рд╣рд░рдг (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдХреАрдорд╛ рд╕реЗ рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрд┐рдирддреА):
SELECT t.table_schema || '.' || t.table_name, q.columns_count FROM information_schema.tables t, LATERAL ( SELECT sum ( 1 ) AS columns_count FROM information_schema.columns c WHERE t.table_schema IN ( 'public' ) AND t.table_schema || '.' || t.table_name = c.table_schema || '.' || c.table_name ) q ORDER BY 1;
рдкрд░рд╕реНрдкрд░ рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ

рдирдпрд╛
postgres_fdw рдореЙрдбреНрдпреВрд▓, рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рдбреЗрдЯрд╛ рддрдХ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓реЗ, рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛
dblink рдореЗрдВ
рдереА , рд▓реЗрдХрд┐рди
postgres_fdw рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдкрд╛рд░рджрд░реНрд╢реА, рдорд╛рдирдХреАрдХреГрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдФрд░ рдЖрдк рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ
postgres_fdw рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдореЗрдВ рдПрдХ рдирдпрд╛
fdb рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ (рдпрд╣ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╣реЛрдЧрд╛):
CREATE TABLE city ( country text NOT NULL, name text NOT NULL, CONSTRAINT uk_city_name UNIQUE ( country, name ) );
рдЪрд▓реЛ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ:
рдЕрдм рд╣рдо рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд╣реИ, fdb рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
SELECT * FROM city;
JSON рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдФрд░ рдСрдкрд░реЗрдЯрд░
JSON рдкреНрд░рдХрд╛рд░
PostgreSQL 9.2 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдереЗ - array_to_json (
JSON рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛) рдФрд░ row_to_json (
JSON рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛)ред рдЕрдм рдФрд░ рдХрд╛рд░реНрдп рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
CREATE TYPE t_link AS ( "from" text, "to" text ); CREATE TABLE param ( id serial NOT NULL, name text NOT NULL, value json NOT NULL, CONSTRAINT pk_param_id PRIMARY KEY ( id ), CONSTRAINT uk_param_name UNIQUE ( name ) ); INSERT INTO param ( name, value ) VALUES ( 'connection', '{ "username" : "Administrator", "login" : "root", "databases" : [ "db0", "db1" ], "enable" : { "day" : 0, "night" : 1 } }'::json ), ( 'link', '{ "from" : "db0", "to" : "db1" }'::json );
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ
PostgreSQL рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдкреНрд░рд╕рдиреНрди рд╣реВрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рднреА рдХрдЪреНрдЪреА рдЪреАрдЬреЗрдВ рд╣реИрдВред
PS рдпрджрд┐ рдЖрдк рдЕрдВрдд рддрдХ рдкрдврд╝рддреЗ рд╣реИрдВ рддреЛ рдзрдиреНрдпрд╡рд╛рджред
рд╕рдВрджрд░реНрдн: