我有一个带有几百个模式的 Postgresql 9.1 数据库。都具有相同的结构,只是数据不同。我需要对表执行选择并从每个模式中获取数据。不幸的是,我还没有找到合适的方法来做到这一点。
我尝试将搜索路径设置为 schema_1、schema_2 等,然后对表执行选择,但它仅从第一个模式中选择数据。
到目前为止,我设法做到的唯一方法是生成一个大查询,例如:
select * from schema_1.table
union
select * from schema_2.table
union
(...another 100 lines....)
Run Code Online (Sandbox Code Playgroud)
有没有其他更合理的方式来做到这一点?如果这是不可能的,我是否可以至少找出哪个模式在该表中有记录而不执行此选择?
不同的模式意味着不同的表,因此如果您必须坚持这种结构,那么它将意味着联合,无论是哪种方式。那可能相当昂贵。如果您希望通过搜索路径的便利进行分区,那么反转您的架构可能是有意义的:
在公共模式中存储一个大表,然后在每个单独的模式中提供视图。
看看这个 sqlfiddle 演示了我的概念:
http://sqlfiddle.com/#!12/a326d/1
还内联粘贴以供后代使用,以防 sqlfiddle 无法访问:
架构:
CREATE SCHEMA customer_1;
CREATE SCHEMA customer_2;
CREATE TABLE accounts(id serial, name text, value numeric, customer_id int);
CREATE INDEX ON accounts (customer_id);
CREATE VIEW customer_1.accounts AS SELECT id, name, value FROM public.accounts WHERE customer_id = 1;
CREATE VIEW customer_2.accounts AS SELECT id, name, value FROM public.accounts WHERE customer_id = 2;
INSERT INTO accounts(name, value, customer_id) VALUES('foo', 100, 1);
INSERT INTO accounts(name, value, customer_id) VALUES('bar', 100, 1);
INSERT INTO accounts(name, value, customer_id) VALUES('biz', 150, 2);
INSERT INTO accounts(name, value, customer_id) VALUES('baz', 75, 2);
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT SUM(value) FROM public.accounts;
SET search_path TO 'customer_1';
SELECT * FROM accounts;
SET search_path TO 'customer_2';
SELECT * FROM accounts;
Run Code Online (Sandbox Code Playgroud)
结果:
425
Run Code Online (Sandbox Code Playgroud)
1 foo 100
2 bar 100
Run Code Online (Sandbox Code Playgroud)
3 biz 150
4 baz 75
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5446 次 |
| 最近记录: |