暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在数据库级别没有约束的情况下,防止交互式网格中列的重复值

ASKTOM 2021-06-23
368

问题描述

在样本数据集emp和dept。

如何防止交互式网格中列的值重复

案例-1
-------

emp表中emp名称的要求对于同一部门不应重复。例如,部门10-帐户我用员工id 8972输入了sam,并为同一部门输入了9872 sam。

我该怎么办?我尝试在过程交互式网格-自动处理和写plsql检查插入和更新,如果okey,然后我手动插入记录。它阻止插入。但是当我以相同的值更新时,它完成了。任何替代解决方案。

在数据库级别,我无法强制执行约束。

这是示例示例。在当前的业务应用程序中,我在公司有这个解决方案。业务应用程序我无法在这里解释,因此使用示例示例我解释了我的问题。

专家解答

任何依靠前端验证来阻止重复的方法都注定要失败。

虽然您可以创建一个流程来检查表中是否已经有员工和部门的行,如下所示:

insert into employees ( emp_id, dept_id )
  select :p1_emp_id, :p1_dept_id 
  from   dual
  where  not exists (
    select * from employees
    where  emp_id := :p1_emp_id
    and    dept_id := :p1_dept_id
  );


如果两个人同时运行该进程,则失败。

您只能查看其他事务提交的更改。因此,如果第二个在第一次提交之前开始,它们都将 “此emp/dept_id组合没有现有行-可以插入”。

所以两者都可以插入该行,让你有重复。

为了避免这种情况,您必须在 (emp_id,dept_id) 上创建唯一约束。

如果你想做insert-If-不存在; 更新-if-exists逻辑,你可以使用合并。但这仍然受到上述并发问题的困扰。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论