我不熟悉PostgreSQL中的触发器,我不知道我想做的是触发器工作,但是我老师的建议。
我有以下链接表:
id | link | visited | filtered | broken | visiting
最后四个属性是布尔值,默认为false。目前我在UPDATE
上将其设置为true,并且没有更多用途(行)。
新设计的想法是让链接表只有id
和link
属性,其他属性属于归档表(visitedLinksTable,brokenLinksTable,filteredLinksTable和visitingTable)。
触发器是否为此?他们说将其移动到另一个表(插入一些存档表并从链接表中删除)
答案 0 :(得分:1)
这些方面的东西应该有效。详情将取决于您的具体架构等。
CREATE FUNCTION update_function() RETURNS TRIGGER AS $$
BEGIN
IF NEW.visited IS TRUE
OR NEW.filtered IS TRUE
OR NEW.broken IS TRUE
OR new.visiting IS TRUE THEN
INSERT INTO archive_table (id,link,visited,filtered,broken,visiting)
VALUES NEW.id,NEW.link,NEW.visited,
NEW.filtered,NEW.broken,NEW.visiting;
DELETE FROM table WHERE id=NEW.id;
RETURN NULL;
END IF;
RETURN NEW
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_trigger
BEFORE UPDATE ON table
FOR EACH ROW EXECUTE PROCEDURE
update_function();
答案 1 :(得分:0)
触发器对此不起作用。大概你需要一些方法来确定删除链接时应该移动到哪个表(访问,破坏,过滤,访问),但是没有办法告诉触发链接应该去哪里。
您可以使用几个非触发器函数来封装这样的进程:
您可以使用存储过程来处理每个转换,但我不知道您是否获得了超过手动INSERT ... SELECT
和DELETE
语句的任何内容。
但是,如果你真的有触发器的东西(嘿,谁不喜欢触发器?)那么你可以使用原来的六列表,添加最后访问的时间戳,并定期做一些清理 - 起来:
delete from link_table
where last_accessed < some_time
and (visited = 't' or filtered = 't' or broken = 't')
然后你可以使用DELETE触发器根据布尔列将链接移动到一个存档表。
答案 2 :(得分:0)
我想,你可以在最近的PostgreSQL上使用视图和查看触发器。一般来说,我认为最好将存储逻辑封装在数据逻辑中,并且视图是一种有用的方法。
另一种方法是通过函数来访问/从表中访问。这样,您可以在必要时更改存储逻辑的同时维护一致的API。这是我经常使用的方法,但与视图方法相比,它有一些不同的权衡: