我想根据某些条件限制在表格中的插入。
我的表就像
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中如何做到这一点。
答案 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
以外的其他选项。