根据以前的插入日期限制插入

时间:2016-04-28 05:56:24

标签: sql oracle insert sql-insert

我想根据某些条件限制在表格中的插入。

我的表就像

col1   col2    Date Create
A        1     04/05/2016
B        2     04/06/2016
A        3     04/08/2016  -- Do not allow insert
A        4     04/10/2016  -- Allow insert

所以我想根据先前插入相同记录的天数来限制插入。

如能够举例所示,A只能在之前插入4天之后再次插入表中。

我在SQL / Oracle中如何做到这一点。

2 个答案:

答案 0 :(得分:0)

您只想在不存在时插入具有相同col1和过早日期的记录:

insert into mytable (col1, col2, date_create)
select 'B' as col1, 4 as col2, trunc(sysdate) as date_create from dual ins
where not exists
(
  select *
  from mytable other
  where other.col1 = ins.col1
  and other.date_create > ins.date_create - 4
);

因此不会插入不需要的记录。但是,不会引起任何例外。如果你想要,我建议使用PL / SQL块或之前的插入触发器。

答案 1 :(得分:0)

如果多个进程同时向您的表写入,并且可能存在冲突的数据,那么oracle数据库应该可以完成这项工作。

这可以通过定义约束来检查是否已存在具有小于四天的相同col1值的条目。

据我所知,不可能直接定义这样的约束。而是定义物化视图并在此视图上添加约束。

create materialized view mytable_mv refresh on commit as
  select f2.col1, f2.date_create, f1.date_create as date_create_conflict
    from mytable f2, mytable f1
   where f2.col1 = f1.col1
     and f2.date_create > f1.date_create
     and f2.date_create - f1.date_create < 4;

当且仅当存在冲突时,此物化视图将包含一个条目。

现在在此视图上定义约束:

alter table mytable_mv add constraint check_date_create   
check(date_create=  
      date_create_conflict) deferrable;

在提交当前事务时执行(因为物化视图已刷新 - 如上面refresh on commit所声明的那样)。 如果您在自动交易中插入表mytable,例如,用于记录表。

在其他情况下,您可以dbms_mview.refresh('mytable_mv')强制在物化视图上刷新,或使用refresh on commit以外的其他选项。