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)
- 如果这有意义的话。因此,id
和content
应该从collection_myblogs
表中复制。如何实现这一目标?
我的理解是,我可以在我的collection_myblogs
和somehow
维护FullText(id, content) == collection_myblogs(id, title)
上的任何插入或更新之前使用触发器
我将不胜感激这方面的任何指导。
【问题讨论】:
【参考方案1】:实际上有很多方法可以处理这个问题。一些例子:
使用表继承来为您的数据创建一个“接口”(不需要触发器,抽象表最终会像视图一样运行)。不过,这是一个复杂的领域。
像您一样使用触发器方法,然后分别处理 UPDATE 和 DELETE。这里的大问题是,如果您有两个相同的文本区域,您的更新触发器需要能够将它们分开。
还有很多其他的,但这些应该可以帮助您入门。
【讨论】:
【参考方案2】:实际上,这很简单。只需关注this
【讨论】:
以上是关于postgresql 触发器(策略)根据另一个表的条目更新表的主要内容,如果未能解决你的问题,请参考以下文章
postgreSQL创建一个触发器函数:更新过student1表的数据后,更新student1_stats表中数据。