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

Posted

技术标签:

【中文标题】postgresql 触发器(策略)根据另一个表的条目更新表【英文标题】:postgresql trigger (strategy) to update table based on entries of another table 【发布时间】:2013-08-13 10:29:34 【问题描述】:

我是 PostgreSQL 的新手(被 django ORM 宠坏了!),我想创建一个触发器,它可以根据另一个表的条目更新一个表。

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

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

..where 字段 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) 上的任何插入或更新之前使用触发器

我将不胜感激这方面的任何指导。

【问题讨论】:

【参考方案1】:

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

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

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

还有很多其他的,但这些应该可以帮助您入门。

【讨论】:

【参考方案2】:

实际上,这很简单。只需关注this

【讨论】:

以上是关于postgresql 触发器(策略)根据另一个表的条目更新表的主要内容,如果未能解决你的问题,请参考以下文章

[译] PostgreSQL 行安全性策略

[译] PostgreSQL 行安全性策略

postgreSQL创建一个触发器函数:更新过student1表的数据后,更新student1_stats表中数据。

SQL技巧两则:选择一个表的字段插入另一个表,根据其它表的字段更新本表内容

如何使用3个不同表的触发器

SQL语句循环一张表的一个字段ID,根据这个字段的内容去修改另一张表,