限制表中数据范围的声明性方法

2023-12-02

我想学习一种声明性方法来解决我不时遇到的与独占日期范围相关的数据约束问题。

下面是一个简化的示例。我有物品和这些物品的价格。我希望价格的有效日期范围是相互排斥的,没有重叠。

据我了解 Oracle 的情况,用户定义的函数不符合使用条件CONSTRAINT声明- 我什至无法想象如果允许的话它的表现会有多糟糕。所以我需要一种使用触发器的程序方法。下面还包括典型的触发源。

我对学习在触发器中使用更好的程序逻辑不感兴趣(这只是一个简单的说明性示例)。我有兴趣学习一种更具声明性的解决方案来解决我(以及可能的其他人)面临的相对流行的数据约束问题。

作为一种实践,我希望尽可能消除基于触发器的解决方案。但是,如果没有触发器,我似乎无法找到摆脱此要求的方法。

create table item ( title varchar2(32) primary key );
create table price ( 
   item           varchar2(32) not null references item (title), 
   price          number(9,2), 
   effective_from date not null, 
   effective_to   date not null, 
   constraint price_from_to_ck check (effective_to > effective_from ));

[REDACTED]
*(A combination of row and statement level triggers inteneded to prevent logical chronological overlap)

insert into item values ('LETTUCE');
insert into item values ('WHISKY');

insert into price values ( 'LETTUCE', 1.05, date '2013-01-01', date '2013-03-31' );
insert into price values ( 'LETTUCE', 1.08, date '2013-04-01', date '2013-06-30' ); 
insert into price values ( 'WHISKY', 33.99, date '2013-01-01', date '2013-05-31' );
insert into price values ( 'WHISKY', 31.15, date '2013-06-01', date '2013-07-31' ); 

-- should fail
insert into price values ( 'WHISKY', 30.55, date '2013-05-15', date '2013-06-05' ); 

在等待下一个Oracle 12c版本,它支持时间有效性,我仍然使用下一个方法:

create table item ( title varchar2(32) primary key );
create table price ( 
   price_id          number primary key,
   item              varchar2(32) not null references item (title), 
   price             number(9,2), 
   effective_from    date not null, 
   effective_to      date not null, 
   effective_prev_to date,
   constraint price_from_to_ck check ( effective_to > effective_from ),
   constraint price_to_prev_ck check ( effective_from = effective_prev_to + 1 ),
   constraint price_from_uq unique ( item, effective_to ),
   constraint price_dates_chain_fk foreign key ( item, effective_prev_to ) references price ( item, effective_to ) );

insert into item values ('LETTUCE');
insert into item values ('WHISKY');

insert into price values ( 1, 'LETTUCE', 1.05, date '2013-01-01', date '2013-03-31', null );
insert into price values ( 2, 'LETTUCE', 1.08, date '2013-04-01', date '2013-06-30', date '2013-03-31' ); 
insert into price values ( 3, 'WHISKY', 33.99, date '2013-01-01', date '2013-05-31', null );
insert into price values ( 4, 'WHISKY', 31.15, date '2013-06-01', date '2013-07-31', date '2013-05-31' ); 

Let's try:

insert into price values ( 5, 'WHISKY', 30.55, date '2013-05-15', date '2013-06-05', date '2013-05-14' ); 

ORA-02291: integrity constraint (USER_4_E7DF1.PRICE_DATES_CHAIN_FK) violated - parent key not found : insert into price values ( 'WHISKY', 30.55, date '2013-05-15', date '2013-06-05', date '2013-05-14' )

但现在更新和删除链中间的日期是一件痛苦的事。它需要更改一个语句中的前一行和后一行MERGE。这就是为什么我添加了price_id列,因为您无法更新其中的键MERGE-- 所以,你需要另一个密钥而不是 (item, effective_%)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

限制表中数据范围的声明性方法 的相关文章

随机推荐

  • 知道 filename:line_no 导入 my_module 的位置

    我有一个模块my module它是由许多文件使用以下方式获取 导入 的 from my module import 在模块内部 我可以知道哪个文件导入了该模块吗 我想知道进行此导入的文件名 line no 所以我需要的代码是 my modu
  • 如何向 eclipse C 项目添加库?

    I need to add a C library to C project in Eclipse indigo What I ve done so far I ve downloaded and installed the library
  • MVC3 中的 URL 重写

    我正在为当地一所大学使用 MVC3 开发一个项目 我遇到了一个要求 我被困住了 找不到任何出路 假设我的 URL 是 www abc com要求是 如果我们在 URL 后输入教师姓名 我们将获得该教师的详细视图 例如 www abc com
  • Tomcat Servlet 类NotFoundException

    我创建了简单的 servlet package servlets import javax servlet ServletException import javax servlet http HttpServlet import java
  • 在 Java Swing 应用程序中创建在线帮助 - 使用 pdf 用户文档

    我正在尝试将一些用户文档链接到我的 Java Swing 应用程序 用户文档是 pdf 格式 我希望能够单击应用程序中的按钮 打开某种 pdf 渲染器来显示我的 userdoc pdf 我不想使用运行时执行命令 我尝试了以下方法 但没有取得
  • 如何在 JSP 中将值插入到 derby 数据库中?

    我在 JSP 中创建了一个表单来将数据插入到 derby 中的数据库中 但它不起作用 数据库名称是 CUSTOMER 表格 ID int CNAME varchar ADDRESS varchar PHONENUMBER varchar c
  • 无法监视 HttpSession / Mockito

    我想要部分嘲笑Httpsession但为此我需要监视它而不是嘲笑它 并且如果没有已经被嘲笑的请求对象 我就无法获得它的接口 请帮忙 换句话说 我怎样才能得到一个对象HttpSession没有HttpServletRequest object
  • 将 Google 图表另存为 pdf

    我正在尝试将饼图另存为 pdf 文件 如下所示http keepcoding ehsanabbasi com php convert google chart to png and pdf 在 php chartsrc 中包含 javasc
  • 无法在 SD 卡上写入文件

    我试图在 SD 卡上写入照片 但没有成功 我已经获得了在可移动存储中写入的权限 并且 SD 卡已安装 另外 我检查了 SD 卡的路径是否存在 并且得到了肯定的结果 失败的地方是当我使用mkdir 功能 它返回 false 并且没有创建文件
  • java中的selenium异常(org.openqa.selenium.remote.UnreachableBrowserException)

    我知道有很多线程正在运行 但没有一个线程可以解决这个问题 我正在尝试使用 selenum 获取 aspx 页面 但它在这行代码处抛出 UnreachableBrowserExceptionWebDriver driver new Chrom
  • 如何为uuid设置cookie

    我有一个网站 每次加载 刷新页面时都会生成一个 uuid 我想使用 cookie 使某个值在一段时间内保持不变 有谁知道可以帮助我的脚本吗 不确定您为什么要求脚本 或者这里的问题是什么 要设置 cookie 只需使用 if empty CO
  • Angular 2如何加载具有子依赖项的第3方供应商节点模块

    正在加载单节点模块在 Angular 2 中角度 cliwiki 中对引导项目进行了很好的描述 只是好奇 如何在使用 angular cli 引导的项目中很好地加载更复杂的节点模块 例如 angular2 apollo 依赖于几个子依赖项
  • 如何使用 AVFoundation 设置逐帧生成的视频的方向?

    我正在编写一个 iPhone 应用程序 它从相机获取视频 通过一些 OpenGL 着色器代码运行它 然后使用以下命令将输出写入视频文件AVFoundation 该应用程序以横向运行 或者 因此所有录制的视频都应该是横向的 我在开始录制之前使
  • 在 Redhat 上从 C++ 解压文件:system() 的替代方法

    我需要在运行 C 程序时解压缩文件 如中所述在 RedHat 机器上执行 C 代码之前等待解压完成 为此 我目前正在执行以下操作 system unzip usr bin File ZippedFile gz d usr bin File
  • 仅对数字列求和并将值除以总计

    我在对数据框进行一些计算时遇到问题 这是我的 DF 还有更多行和列 我想做的是 步骤 1 对于每个月 我想对资产列进行求和 例如 所有 asset Jan 2018 并输出为 DF 步骤 2 然后 对于每个公司 我想将每月的资产除以该月的总
  • C#:为什么要签署程序集?

    在我接管的一些 C 代码中 在 Visual Studio 2005 中 我注意到程序集都使用相同的签名 snk file 为什么前一作者会以这种方式签署程序集 签署程序集是否必要以及什么 不签字会不会有错 有什么缺点 签署程序集 是否会导
  • JavaScript 中如何四舍五入到小数点后一位?

    你能将 JavaScript 中的数字四舍五入到小数点后一个字符 正确四舍五入 吗 我尝试了 10 round 10 但它在 int 末尾留下了两位小数 Math round num 10 10有效 这是一个例子 var number 12
  • 使用 numpy.frompyfunc 将广播添加到带参数的 python 函数

    从像这样的数组db 这将大约是 1e6 300 and a mask 1 0 1 向量 我将目标定义为第一列中的 1 我想创建一个out由其中相应行组成的向量db匹配mask and target 1 其他地方都是零 db np array
  • google api 机器学习 我可以使用 API KEY 吗?

    出于学习目的 我尝试使用机器学习 ml API https cloud google com ml engine reference rest v1 projects models list 我无法确定是否可以使用 API KEY 而不是
  • 限制表中数据范围的声明性方法

    我想学习一种声明性方法来解决我不时遇到的与独占日期范围相关的数据约束问题 下面是一个简化的示例 我有物品和这些物品的价格 我希望价格的有效日期范围是相互排斥的 没有重叠 据我了解 Oracle 的情况 用户定义的函数不符合使用条件CONST