Postgres 有没有办法创建引用另一个表中的日期范围的日期外键?
假设我们有如下两个表,
CREATE TABLE calendar_month (
id serial PRIMARY KEY,
start_date date NOT NULL,
end_date date NOT NULL,
reporting_month character varying(50) NOT NULL
);
CREATE TABLE calendar (
id serial PRIMARY KEY,
holiday bool NOT NULL,
actual_date date NOT NULL
);
在不诉诸触发器的情况下,有没有办法确保在日历表中输入的任何actual_date始终在calendar_month表中有一个相应的reporting_month可以引用?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果你可以稍微改变你的表,你可以使用外键和检查约束来做到这一点:
编辑:Mohan 说过“日历行中的结束日期不一定是=开始日期+ 1 个月间隔”。鉴于我们无法对月份的实际 sart 和结束日期做出任何假设,我们必须稍微做一些事情(正如 Mohan 本人建议的那样):
或者也许
actual_date 应该是
- 这取决于您如何定义月份范围。
check
约束中的actual_date<=month_end_dateif you can change your tables a bit you can do this with a foreign key and a check constraint:
EDIT: Mohan has said that "the end_date in the calendar row will not necessarily be = start_date+ 1 month interval". Give that we can't make any assumptions about the actual sart and end dates of the months, we have to do something slightly (as Mohan himself suggests):
Or perhaps
actual_date<month_end_date
should beactual_date<=month_end_date
in thecheck
constraint - it depends how you define your month bounds.否:
。基于所提供的 CREATE TABLE 语句,触发器是您唯一的选择。
No:
A trigger is your only option based on the CREATE TABLE statements provided.
如果您的 calendar_month 从该月的第一天开始(这似乎合乎逻辑):
这使用触发器,但这只是为了方便。实际检查是通过外键完成的。
If your calendar_month's start at the first day of the month (which would seem logical) :
This uses a trigger, but it is only for convenience. Actual checking is done by foreign keys.