我有一个postgres数据库,有几个表(几百).数据库中表的子集Foo具有相同的模式.
理想情况下,我想创建一个存储过程,它可以针对单个表或针对子集Foo中的所有表运行查询.
伪代码:
CREATE TABLE tbl_a (id INTEGER,name VARCHAR(32),weight double,age INTEGER); CREATE TABLE tbl_b (id INTEGER,age INTEGER); CREATE TABLE tbl_c (id INTEGER,age INTEGER); CREATE TABLE tbl_d (id INTEGER,age INTEGER); CREATE TYPE person_info AS (id INTEGER,age INTEGER); CREATE FUNCTION generic_func(ARRAY one_or_more_table_names) RETURNS person_info -- Run query on table or all specified tables AS $$ $$ LANGUAGE sql;
我怎么能在Postgresql 9.x中实现这个要求?
解决方法
你应该看一下Postgresql中的
table inheritance,它们完全允许你说的话.
例如,您可以创建表parent_tbl:
CREATE TABLE parent_tbl (id INTEGER,weight numeric,age INTEGER);
然后将表链接到此父表:
ALTER TABLE tbl_a INHERIT parent_tbl; ALTER TABLE tbl_b INHERIT parent_tbl; ALTER TABLE tbl_c INHERIT parent_tbl; ALTER TABLE tbl_d INHERIT parent_tbl;
然后,通过parent_tbl的SELECT查询将查询所有tbl_x表,而对tbl_x的查询将仅查询此特定表.
INSERT INTO tbl_a VALUES (1,'coucou',42,42); SELECT * FROM tbl_a; id | name | weight | age ----+--------+--------+----- 1 | coucou | 42 | 42 (1 row) SELECT * FROM parent_tbl; id | name | weight | age ----+--------+--------+----- 1 | coucou | 42 | 42 (1 row) SELECT * FROM tbl_b; id | name | weight | age ----+--------+--------+----- (0 rows)
也可以从给定的子表中过滤数据.例如,如果您对来自表tbl_a和tbl_b的数据感兴趣,您可以这样做
select id,name,weight,age from parent_tbl left join pg_class on oid = parent_tbl.tableoid where relname in ('tbl_a','tbl_b');
编辑:我把数字换成重量而不是双倍,因为我的服务器不支持这种类型.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。