我有这样的表:
date_start date_end account_id product_id 2001-01-01 2001-01-31 1 1 2001-02-01 2001-02-20 1 1 2001-04-01 2001-05-20 1 1
我想禁止给定的重叠间隔(account_id,product_id)
编辑:我找到了一些东西:
CREATE TABLE test ( from_ts TIMESTAMPTZ,to_ts TIMESTAMPTZ,account_id INTEGER,product_id INTEGER,CHECK ( from_ts < to_ts ),CONSTRAINT overlapping_times EXCLUDE USING GIST ( account_id WITH =,product_id WITH =,Box( point( extract(epoch FROM from_ts at time zone 'UTC'),extract(epoch FROM from_ts at time zone 'UTC') ),point( extract(epoch FROM to_ts at time zone 'UTC'),extract(epoch FROM to_ts at time zone 'UTC') ) ) WITH && ) );
如果你想更多地了解这个http://www.depesz.com/2010/01/03/waiting-for-8-5-exclusion-constraints/
我唯一的问题是它不能使用空值作为结束时间戳,我认为用无限值替换它,但不起作用.
解决方法
好的,我最终这样做:
CREATE TABLE test ( from_ts TIMESTAMPTZ,account_id INTEGER DEFAULT 1,product_id INTEGER DEFAULT 1,period(from_ts,CASE WHEN to_ts IS NULL THEN 'infinity' ELSE to_ts END) WITH && ) );
完美无瑕,交易证明.
我只需要安装临时扩展,这将在postgres 9.2中是本地的,btree_gist可以作为9.1中的扩展CREATE EXTENSION btree_gist;
nb:如果没有空时间戳,那么就不需要使用我可以用我的问题中指定的方框的方法来使用时间扩展.