[SQL] 主子表中添加外键约束disable之后无法enable(已解决) [

查看:  946 | 回复:  3
收藏  打印  上一主题  下一主题

[SQL] 主子表中添加外键约束disable之后无法enable(已解决) [复制链接]

   

精华贴数
0
专家积分
1
技术积分
84
社区积分
0
注册时间
2012-11-9
论坛徽章:
1
优秀写手日期:2013-12-18 09:29:13
跳转到指定楼层
1#
  发表于 2013-7-23 16:46:08  | 只看该作者  | 倒序浏览
本帖最后由 mqwh327 于 2014-9-18 20:58 编辑

    有2张表,是主子表关系,两者之间通过3个字段关联,有一天数据处理之后,外键无法enable了;应该是在约束disable期间,有人将主表记录给删除了。    数据量5万多,现在想通过sql语句查一下子表中对应的哪些数据的主记录被删除了,但是不知道怎么搞sql语句啊!!
    主表为t_s_contact,子表为t_s_contact_result,关联字段为t_s_contact_id,t_s_site_id,t_s_dev_id

    t_s_contact_id为主表主键,其余的两个字段为其它表过来的。
    我分别用这3个字段查了,类似下面的
    select * from t_s_contact_result where t_s_contact_id not in(select t_s_contact_id form t_s_contact )
    最后都没有结果出现;
    不知道除了手工比对数据,有没有办法直接用sql查呀?
     数据太多了。。。。
 
   

版主

资深新手

精华贴数
25
专家积分
1880
技术积分
46431
社区积分
252
注册时间
2004-6-26
论坛徽章:
178
鲜花蛋日期:2013-06-19 22:37:17 奥运会纪念徽章:羽毛球日期:2012-12-10 17:55:46 奥运会纪念徽章:乒乓球日期:2012-10-20 00:13:42 ITPUB 11周年纪念徽章日期:2012-10-09 18:05:37 奥运会纪念徽章:体操日期:2012-10-08 11:34:22 奥运会纪念徽章:自行车日期:2012-10-08 11:34:12 奥运会纪念徽章:跆拳道日期:2012-09-18 13:36:08 奥运会纪念徽章:蹦床日期:2012-09-10 10:35:46 奥运会纪念徽章:手球日期:2012-10-22 18:05:08 奥运会纪念徽章:棒球日期:2012-12-10 17:55:46 奥运会纪念徽章:艺术体操日期:2012-12-10 17:55:46 奥运会纪念徽章:马术日期:2013-01-18 14:17:54
2#
  发表于 2013-7-23 22:51:33  | 只看该作者
看上去t_s_contact_id是父表主键,怎么会通过三列关联?你的外键是怎么定义的?
如果外键是三个列组合,你“分别”写三个查询就不等价了,应该是 (t_s_contact_id,t_s_site_id,t_s_dev_id) NOT IN (SELECT t_s_contact_id,t_s_site_id,t_s_dev_id FROM ...)

世界上只有两种编程方法:Oracle的方法和错误的方法。

剑破冰山—Oracle开发艺术 即将隆重推出
http://www.china-pub.com/197199
http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=10114321
 
   

精华贴数
0
专家积分
1
技术积分
84
社区积分
0
注册时间
2012-11-9
论坛徽章:
1
优秀写手日期:2013-12-18 09:29:13
3#
  发表于 2013-7-24 08:30:43  | 只看该作者
newkid 发表于 2013-7-23 22:51 
看上去t_s_contact_id是父表主键,怎么会通过三列关联?你的外键是怎么定义的?
如果外键是三个列组合,你 ...

外键的定义是这样的:
ALTER TABLE PWSYS.T_S_CONTACT_RESULT ADD (
  CONSTRAINT T_S_CONTACT_FK 
FOREIGN KEY (T_S_CONTACT_ID, T_S_SITE_ID, T_S_DEV_ID) 
REFERENCES PWSYS.T_S_CONTACT (T_S_CONTACT_ID, T_S_SITE_ID, T_S_DEV_ID)
    ON DELETE CASCADE DISABLE);
至于为何这样定义,我估计是处于业务方面的考虑;具体的就不清楚了。。。。。还是好久以前别人做的!!!
 
 
   

精华贴数
0
专家积分
1
技术积分
84
社区积分
0
注册时间
2012-11-9
论坛徽章:
1
优秀写手日期:2013-12-18 09:29:13
4#
  发表于 2013-7-24 11:30:25  | 只看该作者
   感谢大师指点,以前不知道可以这么查,是我菜了。。。。
   最后的处理结果是:利用大师给出的sql语句,同时查出3个字段不存在主表但是存在子表的记录,然后删除对应的记录,约束即可enable。具体sql语句如下:
  1. SELECT *
  2.   FROM T_S_CONTACT_RESULT
  3. WHERE (T_S_CONTACT_ID, T_S_SITE_ID, T_S_DEV_ID) NOT IN (
  4.                                                       SELECT T_S_CONTACT_ID, T_S_SITE_ID, T_S_DEV_ID
  5.                                                         FROM T_S_CONTACT)    
  6.                                                         
  7.                                                         
  8.                                                                                                    
复制代码
再次感谢大师指点哈!
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值