使用deferred constraint 解决“先有蛋还是先有鸡的问题”

SQL中使用deferredconstraint解决依赖关系问题
本文介绍如何在SQL中通过使用deferredconstraint解决表间依赖关系导致的插入错误,阐述了通过先创建表,再添加延迟检查的外键约束,以及在事务中同时插入数据的方法来解决问题的过程,展示了事务控制的灵活性。
使用deferred constraint 解决“先有蛋还是先有鸡的问题”
SQL> create table chicken( cid number primary key,
  2                        eid number references egg(id));
                      eid number references egg(id))
                                            *
ERROR at line 2:
ORA-00942: 表或视图不存在
SQL> create table egg (eid number primary key,
  2                    cid number references chicken(cid));
                  cid number references chicken(cid))
                                        *
ERROR at line 2:
ORA-00942: 表或视图不存在
通过上述的语句显然不能创建chicken 表和egg 表,因为他们之间的依存关系。
我们可以通过先创建表,在通过alter table 创建约束。
SQL> create table chicken(cid number primary key,
  2                       eid number);
Table created.
SQL> create table egg(eid number primary key,
  2                   cid number);
Table created.
SQL> alter table chicken add constraint chicken_ref_egg
  2  foreign key (eid) references egg(eid);
Table altered.
SQL> alter table egg add constraint egg_ref_chicken
  2  foreign key (cid) references chicken(cid);
Table altered.
到现在为止,好像一切都是正常的,我们试着插入记录:
id 为1 的鸡,生了2个蛋。这2个蛋是由id 为1 的鸡生的。这段话好纠结。。。
SQL> insert into chicken values(1,2);
insert into chicken values(1,2)
*
ERROR at line 1:
ORA-02291: 违反完整约束条件 (HR.CHICKEN_REF_EGG) - 未找到父项关键字
SQL> insert into egg values(2,1);
insert into egg values(2,1)
*
ERROR at line 1:
ORA-02291: 违反完整约束条件 (HR.EGG_REF_CHICKEN) - 未找到父项关键字
还是因为chicken 表和egg 表的依赖关系的原因导致插入不成功。因为往chicken
表中插入记录的时候在父表egg 中找不到相应的记录,往egg 中插入记录也是一样的。
SQL> alter table chicken drop constraint chicken_ref_egg;
Table altered.
SQL> alter table egg drop constraint egg_ref_chicken;
Table altered.
SQL> edit
Wrote file afiedt.buf
  1  alter table chicken add constraint
  2  chicken_ref_egg
  3  foreign key(eid) references egg(eid)
  4* initially deferred deferrable
SQL> /
Table altered.
SQL> edit
Wrote file afiedt.buf
  1   alter table egg add constraint
  2   egg_ref_chicken
  3   foreign key(cid) references chicken(cid)
  4*  initially deferred deferrable
SQL> /
Table altered.
使用deferred constraint 把对约束的检查推迟到事务commit 的时候。
并且同时往chicken 和 egg 表中都插入数据,构成一个事务,最后提交
现在"先有蛋还是先有鸡的问题"就解决了。而且改变下面两条insert 语句的
执行顺序结果也是一样的。充分体现了事务的灵活性。
SQL>  insert into chicken values(1,2);
1 row created.
SQL>  insert into egg values(2,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from chicken;
       CID        EID
---------- ----------
         1          2
SQL> select * from egg;
       EID        CID
---------- ----------
         2          1
小结:deferred constraint 可以提供更加灵活的事务控制。在有些情况下是非常有用的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-723467/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26110315/viewspace-723467/

混合动力汽车(HEV)模型的Simscape模型(Matlab代码、Simulink仿真实现)内容概要:本文档介绍了一个混合动力汽车(HEV)的Simscape模型,该模型通过Matlab代码和Simulink仿真工具实现,旨在对混合动力汽车的动力系统进行建模与仿真分析。模型涵盖了发动机、电机、电池、传动系统等关键部件,能够模拟车辆在不同工况下的能量流动与控制策略,适用于动力系统设计、能耗优化及控制算法验证等研究方向。文档还提及该资源属于一个涵盖多个科研领域的MATLAB仿真资源包,涉及电力系统、机器学习、路径规划、信号处理等多个技术方向,配套提供网盘下载链接,便于用户获取完整资源。; 适合人群:具备Matlab/Simulink使用基础的高校研究生、科研人员及从事新能源汽车系统仿真的工程技术人员。; 使用场景及目标:①开展混合动力汽车能量管理策略的研究与仿真验证;②学习基于Simscape的物理系统建模方法;③作为教学案例用于车辆工程或自动化相关课程的实践环节;④与其他优化算法(如智能优化、强化学习)结合,实现控制策略的优化设计。; 阅读建议:建议使用熟悉Matlab/Simulink及Simscape基础操作,结合文档中的模型结构逐步理解各模块功能,可在此基础上修改参数或替换控制算法以满足具体研究需求,同时推荐访问提供的网盘链接获取完整代码与示例文件以便深入学习与调试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值