我有一个表x(x_id,ts),其中ts是一个时间戳。 我还有第二个表y(y_id,day,month,year),应该具有x(ts)的值。 (x_id和y_id都是串行的) 例如:
x y
_x_id_|__________ts__________ _y_id_|_day_|_month_|__year__
1 | '2019-10-17 09:10:08' 1 17 10 2019
2 | '2019-01-26 11:12:02' 2 26 1 2019
但是,如果在x上我在同一天但有不同的小时数有2个时间戳,则这两个表应如下所示:
x y
_x_id_|__________ts__________ _y_id_|_day_|_month_|__year__
1 | '2019-10-17 09:10:08' 1 17 10 2019
2 | '2019-10-17 11:12:02'
含义y不能有两行相同的日期,月份和年份。 目前,我的操作方式是:
INSERT INTO y(day, month, year)
SELECT
EXTRACT(day FROM ts) AS day,
EXTRACT(month FROM ts) AS month,
EXTRACT(year FROM ts) AS year
FROM x
ORDER BY year, month, day;
但是,您可能知道,这不会检查时间戳记是否共享同一日期,那么我该怎么做? 谢谢您的时间!
答案 0 :(得分:2)
假设您按照上述建议构建唯一索引,请将插入内容更改为:
insert into y(day, month, year)
select extract(day from ts) as day,
, extract(month from ts) as month,
, extract(year from ts) as year
from x
on conflict do nothing;
我希望您的表X不会太大,因为上述插入(如您的原始表)将尝试在每次执行时为X中的每一行向Y中插入一行- NO WHERE 子句。
答案 1 :(得分:1)
将表y
上的UNIQUE约束添加到 prevent 中,两次添加相同的日期。
CREATE UNIQUE INDEX CONCURRENTLY y_date
ON y (year,month,day)
然后将其添加到y
:
ALTER TABLE y
ADD CONSTRAINT y_unique_date
UNIQUE USING INDEX y_date
请注意,如果违反约束,则会收到SQL错误。如果您不希望这样做,而忽略INSERT,请使用BEFORE INSERT trigger,当检测到“日期”已存在时返回NULL
,或者在{{1 }}语句,如hinted by @Belayer。