如何用触发器防止插入重复字段

didoleo 2008-02-27 09:25:20
如题

如何防止某个字段在 一定条件 下 不重复,用触发器实现. (或者提供一种思路)

注意 不允许重复是在某种条件下.而非所有情况下不允许重复. 

 比如 表 test ,字段 a ,b ,当b为某种条件时 a不允许重复.
...全文
238 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
codearts 2008-02-27
  • 打赏
  • 举报
回复
用唯一索引, 根据某条件设置为null(null在索引中不存储)

SQL> create table t(a int, b int);

表已创建。

SQL> create unique index idx_t_test on t(case when b=5 then null else a end, case when b=5 then null else b end);

索引已创建。

SQL> insert into t(a, b) values(1,1);

已创建 1 行。

SQL> insert into t(a, b) values(1,1);
insert into t(a, b) values(1,1)
*
ERROR 位于第 1 行:
ORA-00001: 违反唯一约束条件 (SYS.IDX_T_TEST)


SQL> insert into t(a, b) values(1,5);

已创建 1 行。

SQL> insert into t(a, b) values(1,5);

已创建 1 行。

SQL> insert into t(a, b) values(1,5);

已创建 1 行。

SQL> select * from t;

A B
---------- ----------
1 1
1 5
1 5
1 5
didoleo 2008-02-27
  • 打赏
  • 举报
回复
and a = 某个固定的值 ??

没有固定的值,就是为了防止在update的时候产生重复值
dawugui 2008-02-27
  • 打赏
  • 举报
回复
比如 表 test ,字段 a ,b ,当b为某种条件时 a不允许重复.
-------------------------------------
if not exists (select 1 from tb where b = 为某种条件 and a = 某个固定的值)
insert into tb ....
didoleo 2008-02-27
  • 打赏
  • 举报
回复
补充一点. 不能用insert触发,只能用update触发,因为这个字段开始都是insert 空值进去,后来才做update的.发现有重复的.但不允许他有重复(在某种条件下),但找不到为什么会重复,因此想用update触发器来抛一错.
didoleo 2008-02-27
  • 打赏
  • 举报
回复
楼上的方法不错,再问一句,如果 唯一约束的条件是在另外一张表里该怎么写?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧