如何按计划更新PostgreSQL中表中的值?

时间:2017-12-12 05:50:06

标签: sql database postgresql scheduling

让我们说我有一个兽医应用程序,并且有2个数据库(让我们说医生执行操作):

包含字段的用户数据库: ID,电子邮件,名称,密码和regStamp。

PetOperations数据库,包含字段: id,id(对用户的引用),doctorName,operationStamp和operationStatus。

如果我想在Pet数据库中放入一个新的petOperation时更新一个operationStatus字段怎么办?初始状态是20分钟后PERFOMING变为PERFORMED,但仅限于此唯一operationId,如果currentTime - operationStamp> = 20)。我怎样才能做到这一点?也许,有更好的方式而不是减法时间?

2 个答案:

答案 0 :(得分:0)

我认为您需要重新考虑一下您的数据模型。据我了解您的问题,您有已安排的操作,并且您希望将它们视为在计划的时间片完成后执行。

PostgreSQL没有本机功能可以在20分钟内更新值。您可以使用cron作业,但我认为更优雅的解决方案是改变您的数据模型。

添加“表格方法”,即可获得状态计算。

假设您的表现在包含:

id, id(reference to user), doctorName, operationStamp, operationTsrange

然后你创建一个类似的函数:

create or replace function status(operation) returns text language sql
as $$
     select case when $1.operationTsrange is null then 'Not Scheduled'
                 when now() << $1.operationTsrange THEN 'Scheduled'
                 when now() <@ $1.operationTsrange THEN 'Performing'
                 when now() >> $1.operationTsrange THEN 'Performed'
             END;
$$;

然后你可以搜索这个。如果您需要不同的长度间隔,您可以在更新时间指定它们。

答案 1 :(得分:0)

我不确定你想做什么。

如果您只想在operationstatus行时设置初始INSERT,请使用BEFORE INSERT触发器。

如果希望值根据选择的时间而改变,请使用“计算列”,即不要在表中定义列,而是在包含列的表上定义视图,酌情计算。