我有日期范围的数据,某些日期不会持续几天,在丢失的窗口中,我只想插入以前的数据。
有没有办法在自我插入数据的过程中解决这个问题
例如
create table foo (ID VARCHAR(10), foo_count int, actual_date date);
insert into foo ( values('234534', 100, '2017-01-01'),('234534', 200, '2017-01-02'));
insert into foo ( values('234534', 300, '2017-01-03') );
insert into foo ( values('234534', 300, '2017-01-08') );
在最后一次插入之后,我可以确保先前的数据已生成
所以应该看起来像这样
ID | foo_count | actual_date
-----------+-----------------+------------
234534 | 100 | 2017-01-01
234534 | 200 | 2017-02-01
234534 | 300 | 2017-03-01
234534 | 300 | 2017-04-01
234534 | 300 | 2017-05-01
234534 | 300 | 2017-06-01
234534 | 180 | 2017-07-01
我正在使用JPA插入它,当前我查询表并在表中查看当前日期并填充缺少的数据
我会考虑一个更好的INSERT
陈述。从SELECT
语句插入将使事情变得容易。该SELECT
语句可用于生成请求的日期序列。
INSERT INTO foo
SELECT
--<advanced query>
但是,我想这不可能简单地完成,因为您不是直接使用JDBC或想使用本机查询来插入数据。
在这种情况下,您可以将触发器安装到数据库中,这可以起到神奇的作用:
触发功能:
CREATE FUNCTION insert_missing()
RETURNS TRIGGER AS
$$
DECLARE
max_record record;
BEGIN
SELECT -- 1
id,
foo_count,
actual_date
FROM
foo
ORDER BY actual_date DESC
LIMIT 1
INTO max_record;
IF (NEW.actual_date - 1 > max_record.actual_date) THEN -- 2
INSERT INTO foo
SELECT
max_record.id,
max_record.foo_count,
generate_series(max_record.actual_date + 1, NEW.actual_date - 1, interval '1 day'); -- 3
END IF;
RETURN NEW;
END;
$$ language 'plpgsql';
generate_series()
。然后创建ON BEFORE INSERT
触发器:
CREATE TRIGGER insert_missing
BEFORE INSERT
ON foo
FOR EACH ROW
EXECUTE PROCEDURE insert_missing();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句