postgresql触发器(策略)根据另一个表的条目更新表

时间:2013-08-13 10:29:35

标签: postgresql postgresql-9.2

我对PostgreSQL相当新(被django ORM宠坏了!),我想创建一个触发器,根据另一个表的条目更新表。

所以,我的架构上有以下表格:

collection_myblogs(id, col1,col2,title,col4,col5)

..其中字段id是自动生成的。现在,我有一个像这样创建的新表:

CREATE TABLE FullText(id SERIAL NOT NULL, content text NOT NULL);
ALTER TABLE ONLY FullText ADD CONSTRAINT fulltext_pkey PRIMARY KEY (id);

我从collection_myblogs中插入值,如下所示:

INSERT INTO FullText(content) SELECT title FROM collection_myblogs;

到目前为止一切正常......我现在想在FullText上触发一个触发器,以便FullText每次使用新条目时都会使用新条目更新自己.collection_myblogs有一个新条目。所以,我尝试创建一个触发器如下:

CREATE TRIGGER collection_ft_update BEFORE INSERT OR UPDATE ON collection_myblogs FOR EACH ROW EXECUTE PROCEDURE ft_update();

现在,我不完全确定应该在ft_update()函数上发生什么,目前,我有:

CREATE FUNCTION ft_update() RETURNS trigger AS '
BEGIN
INSERT INTO FullText(content) SELECT new.title;
return new;
END
' LANGUAGE plpgsql;

..适用于INSERTS但不适用UPDATES。即如果我更新了原始列collections_myblog(title)的标题,它在FullText上显示为新条目我不确定如何在此处理ids

我希望每个表上的ids即主键是相同的。所以,我的想法是FullText(id, content) == collection_myblogs(id, title) - 如果这是有道理的。因此,idcontent应该从collection_myblogs表中复制。如何实现这一目标?

我的理解是,我可以在collection_myblogssomehow维护FullText(id, content) == collection_myblogs(id, title)

上的任何插入或更新之前使用触发器

我将不胜感激任何指导。

2 个答案:

答案 0 :(得分:0)

实际上有很多方法可以解决这个问题。一些例子:

  1. 使用表继承为数据创建“接口”(不需要触发器,抽象表最终像视图一样运行)。但这是一个复杂的领域。

  2. 像您一样使用触发器方法,然后单独处理UPDATE和DELETE。这里的一个重要问题是,如果您有两个相同的文本区域,则更新触发器需要能够将它们分开。

  3. 还有很多其他的,但那些应该让你开始。

答案 1 :(得分:-2)

实际上,结果很简单。只需按照this