【发布时间】:2019-06-07 03:48:16
【问题描述】:
我有 100 多个具有相同架构的表,并且我有一个触发器函数,可以在将数据插入到该表时更新某些列。
表架构:
CREATE TABLE symbol_daily_ohlc (
cdate date,
open numeric(8,2),
high numeric(8,2),
low numeric(8,2),
close numeric(8,2),
sma8 numeric(8,2)
);
触发功能:
create or replace function update_sma8() RETURNS TRIGGER AS
$$
BEGIN
UPDATE symbol_daily_ohlc d SET sma8 = s.simple_mov_avg
FROM
(
SELECT sec.cdate,AVG(sec.close)
OVER(ORDER BY sec.cdate ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS
simple_mov_avg FROM symbol_daily_ohlc sec
)s where s.cdate = NEW.cdate --The newly inserted cdate
AND d.cdate = s.cdate;
RETURN NULL;
END $$ language plpgsql;
在桌子上设置触发器:
CREATE TRIGGER trig_update_sma
AFTER INSERT ON symbol_daily_ohlc
FOR EACH ROW
EXECUTE PROCEDURE update_sma8();
这适用于给定的表,即 symbol_daily_ohlc。我想使用相同的触发函数,即 update_sma8() 用于具有相同架构的任何表(我不想为不同的表重写相同的函数)。
我尝试用 TG_TABLE_NAME 替换表名(即 symbol_daily_ohlc),但这不起作用 - 引发错误。那么该怎么做呢?
参考:SQL trigger function to UPDATE daily moving average upon INSERT
【问题讨论】:
-
您不应该拥有具有相同架构的表。如果您正在考虑这样的事情,那么您的数据模型可能存在问题。所有这些数据都应该放在一个表中,其中的一列定义了您希望数据具有的任何其他属性。
-
该数据库用于存储股票市场的历史数据,即不同品种(股票)的数据。我认为这是研究特定股票的更好方法。
-
然而,拥有一个名为“stock_symbol”的列就意味着不会出现这个问题。如果你愿意,你仍然可以拥有一百万张“桌子”。
CREATE VIEW msft_history AS SELECT * FROM all_stock_history WHERE stock_symbol = 'MSFT';CREATE VIEW goog_history AS SELECT * FROM all_stock_history WHERE stock_symbol = 'GOOG' -
而不是
UPDATE将您想要的值分配给new伪记录的各个列。然后,您将不会在触发器主体中拥有表名,并且可以将其用于具有您寻址的列的每个表(当然具有兼容的类型)。 -
@GordonLinoff 我接受了您的建议,并相应地更改了我的数据库。感谢你和凯厄斯·贾德。
标签: sql postgresql triggers