12
返回列表 发新帖
楼主: weijsh

除了PK,Unique IDX外还有什么方法对column进行唯一约束?

[复制链接]
论坛徽章:
42
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
11#
发表于 2005-3-8 17:51 | 只看该作者
普通索引也可以实现UK约束的,大家应当记得约束有一个DEFFERED属性吧。

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
12#
发表于 2005-3-8 17:55 | 只看该作者

自治事务读取的是最近的事务的数据,不是当前事务的

SQL> insert into uq_tri select 2 from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> insert into uq_tri select 2 from dual;
insert into uq_tri select 2 from dual
            *
ERROR at line 1:
ORA-20001: duplicate pk error
ORA-06512: at "SCOTT2.UNTRI", line 7
ORA-04088: error during execution of trigger 'SCOTT2.UNTRI'


SQL> select * from uq_tri;

        PK
----------
         2

SQL>

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
13#
发表于 2005-3-8 17:57 | 只看该作者
最初由 d.c.b.a 发布
[B]普通索引也可以实现UK约束的,大家应当记得约束有一个DEFFERED属性吧。 [/B]


记得,但这个属性怎么实现UK功能?

使用道具 举报

回复
论坛徽章:
42
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
14#
发表于 2005-3-8 17:58 | 只看该作者
先CREATE INDEX,再加UNIQUE的约束就可以了。

使用道具 举报

回复
论坛徽章:
42
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
15#
发表于 2005-3-8 18:00 | 只看该作者
在COMMIT时才会检查的。

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
16#
发表于 2005-3-8 18:11 | 只看该作者
自治事务看不到调用事务未提交的更改,所以自治事务不能用在这种情况。

UPDATE我觉得倒不是大问题,只要不是索引组织表,因为在触发器中也能房问当前更改记录的rowid。

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
17#
发表于 2005-3-9 09:27 | 只看该作者

Re: 除了PK,Unique IDX外还有什么方法对column进行唯一约束?

最初由 weijsh 发布
[B]除了PK,Unique IDX外还有什么方法对column进行唯一约束?有check的唯一性约束吗? [/B]


说说你要做什么?

使用道具 举报

回复
论坛徽章:
84
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-02-13 15:13:362012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
18#
发表于 2005-3-9 09:50 | 只看该作者
不明白这个需求倒是为什么?说明白目的才好想办法把。

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
19#
发表于 2005-3-9 10:24 | 只看该作者
最初由 wyq21973 发布
[B]自治事务看不到调用事务未提交的更改,所以自治事务不能用在这种情况。

UPDATE我觉得倒不是大问题,只要不是索引组织表,因为在触发器中也能房问当前更改记录的rowid。 [/B]


这两句话都有问题。
触发器中的自治事务内看不到触发事务未提交的更改,也看不到其它事务未提交的更改。
用AFTER UPDATE触发器可以简单实现UPDATE后唯一性的检查。


我刚刚试了一下,用触发器维护同步表也做不出这个功能,在同一个会话内部可以,但不同会话间不行。

[php]
wyq@ORCL>create table t (id int);

Table created.

wyq@ORCL>create table t_mirror as select * from t;

Table created.

wyq@ORCL>create or replace trigger t_trg1
  2    before insert or update or delete on t
  3    for each row
  4  Declare
  5     l_Cnt Pls_Integer;
  6     Cursor Cur_Cnt(p_Id Pls_Integer) Is
  7        Select 1 From t_Mirror Where Id = p_Id For Update;
  8  Begin
  9     If Inserting Then
10        l_Cnt := 0;
11        For x In Cur_Cnt(:New.Id) Loop
12           l_Cnt := l_Cnt + 1;
13        End Loop;
14        If l_Cnt > 0 Then
15           Raise_Application_Error(-20011, 'duplicate id,insert denied!');
16        End If;
17     
18        Insert Into t_Mirror Values (:New.Id);
19     End If;
20     If Updating Then
21        Update t_Mirror Set Id = :New.Id Where Id = :Old.Id;
22     End If;
23     If Deleting Then
24        Delete From t_Mirror Where Id = :Old.Id;
25     End If;
26  End;
27  /

Trigger created.

wyq@ORCL>insert into t values (1);

1 row created.

wyq@ORCL>insert into t values (2);

1 row created.

wyq@ORCL>select * from t;

        ID
----------
         1
         2

wyq@ORCL>insert into t values (1);
insert into t values (1)
            *
ERROR at line 1:
ORA-20011: duplicate id,insert denied!
ORA-06512: at "WYQ.T_TRG1", line 12
ORA-04088: error during execution of trigger 'WYQ.T_TRG1'


wyq@ORCL>
[/php]

上面演示了对这个表的串行插入可以检测到冲突ID,但当有多个会话并发进行插入时,检测不到可能有的冲突ID,游标的行锁没有效果,因为其它事务插入的相同数据如果还未提交就不可见。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表