不幸的是,当前的SQL或其在所有RDBMS产品中的实现都不能完全支持时间关系。
只有Teradata和DB2具有某些功能,这些功能实现了在两个或更多列中有时间的约束。
我的例子:
进行模式测试;
创建表产品(
product_ID INT NOT NULL,
更高版本NVARCHAR(50),
PRIMARY KEY(product_ID)
);
创建表
广告系列(campaign_ID INT NOT NULL,
product_ID INT NOT NULL,
价格DECIMAL,
PRIMARY KEY(campaign_ID)
)
;
更改表广告活动
添加约束XFK_campaign_productid外
键(product_ID)参考产品(product_id)时不采取任何
措施;
如果添加时间列business_startdate和business_enddate以及可选的
transaction_starttime和transaction_endtime,则不能再强制执行引用完整性。
如果要实现以下约束,则可能必须实现触发器或存储过程或应用程序级编码:
CREATE TABLE CAMPAIGN(
CAMPAIGN_ID INT NOT NULL,
PRODUCT_ID INT NOT NULL,
business_startdate DATE NOT NULL,
business_enddate DATE NOT NULL,
transaction_starttime TIMESTAMP NOT NULL,
transaction_endtime TIMESTAMP NOT NULL,
价格DECIMAL,
PRIMARY KEY(CAMPAIGN_ID,business_startdate,transaction_starttime)
)
;
对于DB2,存在以下语法的临时主键约束:
CREATE TABLE CAMPAIGN(
campaign_ID INT非空,
product_ID INT非空,
business_startdate DATE非空,
business_enddate DATE非空,
价格DECIMAL,
PERIOD BUSINESS_TIME(business_startdate,business_enddate),
PRIMARY KEY(campaign_ID,BUSINESS_TIME不带重叠
)
;