postgresql – 多字段UNIQUE约束可以包含多个表中的字段吗?

postgresql – 多字段UNIQUE约束可以包含多个表中的字段吗?,第1张

概述我有以下2个表格: Bookings - User IDShifts - Booking ID - Date 我想确保用户在同一天没有预订多个班次.换句话说,字段的UNIQUE约束[Bookings.UserID,Shifts.date] 我可以在PostgreSQL中执行此 *** 作吗? PostgreSQL中的索引位于一个表中,不能跨越多个表. 但您可以使用正确的表格布局解决您的问题 我有以下2个表格:

Bookings  - User IDShifts  - Booking ID  - Date

我想确保用户在同一天没有预订多个班次.换句话说,字段的UNIQUE约束[Bookings.UserID,Shifts.date]

我可以在Postgresql中执行此 *** 作吗?

解决方法 Postgresql中的索引位于一个表中,不能跨越多个表.

但您可以使用正确的表格布局解决您的问题.您可能需要的是一个n:m关系,用3个表实现.然后有各种方法来强制你的病情.

>您可以在冗余预订中存储日期,在(usr_ID,shift_date)上创建主键而不是(usr_ID,shift_ID),并使用(shift_ID,shift_date)上的多列外键保证参照完整性:

CREATE table usr(  usr_ID serial PRIMARY KEY --,more?);CREATE table shift(  shift_ID serial PRIMARY KEY,shift_date date --,more?);

这也需要先换班的独特指数:

CREATE UNIQUE INDEX shift_date_IDx ON shift (shift_ID,shift_date);CREATE table booking(  usr_ID int REFERENCES usr(usr_ID),shift_ID int,more?,CONSTRAINT booking_pkey PRIMARY KEY (usr_ID,shift_date),CONSTRAINT booking_fkey FOREIGN KEY (shift_ID,shift_date) REFERENCES shift(shift_ID,shift_date));

>另一种限制较少但也不太可靠的方法是在表预订上触发ON INSERT或UPDATE,检查用户是否已经转换了新日期.没有冗余日期列可以工作.

我会选择第一个解决方案.

Postgresql中的视图也没有索引(据我所知,从v9.1开始).

您可以创建一个函数,为给定的shift_ID返回shift_date并将其声明为IMMUtable(实际上,它不是).有了它,您可以在表达式上创建一个多列索引:

CREATE function f_shift_date (shift_ID int) RETURNS date LANGUAGE sql IMMUtable AS$BODY$   SELECT shift_date FROM shift WHERE shift_ID = ;$BODY$;CREATE UNIQUE INDEX shift_date_IDx ON booking (shift_ID,f_shift_date(shift_ID));

这会强制你的条件.但说实话,这是非常自杀的.索引依赖于无限期获得shift_ID相同日期的条件.如果shift_date相对于其shift_ID发生了变化,则必须重新创建索引,否则将产生不正确的结果.所以,不要这样做.

总结

以上是内存溢出为你收集整理的postgresql – 多字段UNIQUE约束可以包含多个表中的字段吗?全部内容,希望文章能够帮你解决postgresql – 多字段UNIQUE约束可以包含多个表中的字段吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1161412.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存