我已经阅读了几个显示时间有效性和时间特征的 oracle 教程。但是,在我读过的示例中,演示表中没有使用主键。
http://docs.oracle.com/cd/E16655_01/appdev.121/e17620/adfns_design.htm#ADFNS1005 http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/ilm /时间/时间.html
是否应该将主键添加到这些表中?我问是因为我想知道这些时态表中的一个应该如何被另一个表引用。我可以将外键从一个时态表添加到另一个时态表吗?
如果我添加一个 pk/ 外键 realtionship,然后用 pk 更新表中引用的表,则带有 fk 的表指向一条不再相关的记录……时态数据是否会破坏正常的主键 - 外键关系?如果是这样,这对性能有何影响,我是否只使用普通列作为“外键”并为查询中的引用时间段选择正确的列?
有没有人知道或有任何示例或教程可以显示具有正常或伪正常 pk / fk 使用的时间数据?
谢谢
不幸的是,目前所有 RDBMS 产品中的 SQL 或它的实现并不完全支持时间关系。
只有 Teradata 和 DB2 具有在两个或多个列中实现约束的某些功能。
我的例子:
设置模式测试;
CREATE TABLE PRODUCT (
product_ID INT NOT NULL,
供应商 NVARCHAR(50),
PRIMARY KEY (product_ID)
) ;
CREATE TABLE CAMPAIGN (
campaign_ID INT NOT NULL,
product_ID INT NOT NULL,
price 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,
price DECIMAL,
PRIMARY KEY (campaign_ID,business_startdate,transaction_starttime)
)
;
对于 DB2,存在以下语法中的临时主键约束:
CREATE TABLE CAMPAIGN (
campaign_ID INT NOT NULL,
product_ID INT NOT NULL,
business_startdate DATE NOT NULL,
business_enddate DATE NOT NULL,
price DECIMAL,
PERIOD BUSINESS_TIME (business_startdate,business_enddate),
PRIMARY KEY (campaign_ID,BUSINESS_TIME WITHOUT OVERLAPS)
)
;