各位大虾,交流一下经验,如何保证复杂一对多关系?

chenxihua 2003-05-10 10:51:18
各位大虾,交流一下经验,如何保证复杂一对多关系?
比如有如下规则

一个委员会至少有3名委员,
    0..1      3..*
委员会 --------------------------------  委员
...全文
28 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenxihua 2003-05-10
  • 打赏
  • 举报
回复
据我所知,这确实是关系数据库的一大弱点,
但Sybase有check on commit来解决,
Oracle没有道理不支持啊 :)
双子涂鸦 2003-05-10
  • 打赏
  • 举报
回复
没有解决方法
关系数据库提倡一个依存关系
皮之不存,毛将焉附

如果非要这样做的话,那就应该建立存储过程并需要辅助相应的存储点(savepoint)进行处理
不过我认为这样意义不大
beckhambobo 2003-05-10
  • 打赏
  • 举报
回复
委员会表(id,name,....)会编号,名称
委员表(idno,name,id...)委员编号,委员姓名,所属会编号

select idno,name,(select name from 委员会表 where id=idno) noname from 委员表 group by id having cound(1)>=3;
chenxihua 2003-05-10
  • 打赏
  • 举报
回复
各位看清楚了,不只是简单的外键约束,是一个特殊的一对多关系,
“一个” 委员会至少要有 “三个”委员!
developer2002 2003-05-10
  • 打赏
  • 举报
回复
你这个一对多,只要在委员表增加委员会字段即可。若觉得必要,可以用外键约束
chenxihua 2003-05-10
  • 打赏
  • 举报
回复
如果用触发器保障的话,提交的时候子表中必然没有数据,无法做到。
Sybase的联系中有个check on commit,子表在提交时才检查约束,
比如:是否存在父纪录。我相信Oracle中一定有解决的办法,会者不难,
请各位不吝赐教啊!
ReplyRobot 2003-05-10
  • 打赏
  • 举报
回复
up
chenxihua 2003-05-10
  • 打赏
  • 举报
回复
非常感谢 maohaisheng(www.chinaspirit.net)
用你的方法完全可以约束上述的一对多关系!

问题解决了,BlueskyWide(谈趣者) 说的对,
我的看法和你完全一样,Sybase能做到的Oracle
一定能做到
BlueskyWide 2003-05-10
  • 打赏
  • 举报
回复
楼主的想法是可以理解的。
但“杀鸡杀猴各有各杀法”,不能强求一律。
百花齐放嘛。
Oracle和Sybase都是做database的,谁说他们不在相互学习。
maohaisheng 2003-05-10
  • 打赏
  • 举报
回复
选择了DEFERRABLE选项
可以通过SET CONSTRAINTS 语句控制约束检查
文档上面的例子:
Setting Constraints Examples
The following statement sets all deferrable constraints in this transaction to be checked immediately following each DML statement:
SET CONSTRAINTS ALL IMMEDIATE;
The following statement checks three deferred constraints when the transaction is committed:
SET CONSTRAINTS unq_name, scott.nn_sal,
adams.pk_dept@dblink DEFERRED;


注:以上测试范例来自ORACLE文档
maohaisheng 2003-05-10
  • 打赏
  • 举报
回复
不好意思,没说明白


oracle在进行表级或者列给约束定义的时候,可以选择DEFERRABLE或者NOT DEFERRABLE选项。当选择了DEFERRABLE选项,可以将指定将约束检查推迟到事务结束。而NOT DEFERRABLE选项指定在每个DML语句即将结束时进行约束条件的检查
chenxihua 2003-05-10
  • 打赏
  • 举报
回复
to maohaisheng(www.chinaspirit.net)
我不知道你在说什么
maohaisheng 2003-05-10
  • 打赏
  • 举报
回复
SQL> CREATE TABLE orders
2 (ord_num NUMBER, CONSTRAINT unq_num UNIQUE (ord_num)
3 INITIALLY DEFERRED DEFERRABLE);

表已创建。

SQL> insert into orders values(1);

已创建 1 行。

SQL> insert into orders values(1);

已创建 1 行。

SQL> commit;
commit
*
ERROR 位于第 1 行:
ORA-02091: 事务处理已重算
ORA-00001: 违反唯一约束条件 (SCOTT.UNQ_NUM)


SQL> CREATE TABLE orders2
2 (ord_num NUMBER, CONSTRAINT unq_num UNIQUE (ord_num) );
(ord_num NUMBER, CONSTRAINT unq_num UNIQUE (ord_num) )
*
ERROR 位于第 2 行:
ORA-02264: 名称已被一现有约束条件占用


SQL> CREATE TABLE orders2
2 (ord_num NUMBER, CONSTRAINT unq_num2 UNIQUE (ord_num) );

表已创建。

SQL> insert into orders2 values(1);

已创建 1 行。

SQL> insert into orders2 values(1);
insert into orders2 values(1)
*
ERROR 位于第 1 行:
ORA-00001: 违反唯一约束条件 (SCOTT.UNQ_NUM2)


SQL>

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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