PostgreSQL中的计算/计算列
PostgreSQL是否支持计算/计算列,如MS SQL Server? 我在文档中找不到任何内容,但由于此function包含在其他许多DBMS中,所以我想我可能会错过一些东西。
例如: http : //msdn.microsoft.com/en-us/library/ms191250.aspx
PostgreSQL本身不支持“Computed Columns”。
您可以使用视图实现类似的function。
或者你可以使用function,看起来就像计算列 。
这个相关答案的详细解释:
- 将常用查询存储为列?
“持久”计算列可以用function相同的方式用触发器来实现。
物化视图是一个密切相关的概念。
Postgres 直接使用Postgres 9.3实现物化视图 。
在早期版本中,人们必须手动pipe理MV。
一个办法是用触发器!
CREATE TABLE computed( one SERIAL, two INT NOT NULL ); CREATE OR REPLACE FUNCTION computed_two_trg() RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER AS $BODY$ BEGIN NEW.two = NEW.one * 2; RETURN NEW; END $BODY$; CREATE TRIGGER computed_500 BEFORE INSERT OR UPDATE ON computed FOR EACH ROW EXECUTE PROCEDURE computed_two_trg();
触发器在更新或插入行之前触发。 它改变了我们想要计算NEW
logging的字段,然后它返回那条logging。
是的你可以!! 解决scheme应该是简单,安全和高性能的…
我是新来的postgresql,但似乎你可以创build计算列通过使用expression式索引 ,配对视图 (该视图是可选的,但使生活更容易一些)。
假设我的计算是md5(some_string_field)
,那么我创build索引为:
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
现在,任何对MD5(some_string_field)
起作用的查询都将使用索引,而不是从头开始计算。 例如:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
你可以用解释来检查这个。
然而在这一点上,你依靠表的用户知道如何构build列。 为了使生活更轻松,您可以在原始表格的扩充版本上创build一个VIEW
,将计算的值作为新列添加:
CREATE VIEW some_table_augmented AS SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
现在,使用some_table_augmented
任何查询将能够使用some_string_field_md5
而不用担心它是如何工作的。他们只是获得良好的性能。 该视图不会复制原始表中的任何数据,因此它具有良好的内存和性能。 但是请注意,你不能更新/插入视图,只能到源表中,但如果你真的想,我相信你可以使用规则将插入和更新redirect到源表(作为最后一点,我可能是错的我从来没有尝试过自己)。
编辑:看起来如果查询涉及竞争索引,规划师引擎可能有时不会使用expression式索引。 这个select似乎与数据有关。
Check约束的轻量级解决scheme:
CREATE TABLE example ( discriminator INTEGER DEFAULT 0 NOT NULL CHECK (discriminator = 0) );