暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 未发生外键违规

askTom 2018-09-26
193

问题描述

嗨,
我有父表X (代码表),和子表客户。

我对客户启用了FK约束。但是数据库仍然在表客户表中接受/插入CDE,而表X中不存在。

启用FK约束时,它必须在插入时拒绝记录,因为找不到父键。

这是Power Designer的脚本:

更改表客户
添加约束FK_CUST_04外键 (CDE)
参考文献X(CDE);

我从SQL developer验证。FK存在及其启用。不确定是什么问题?

注意: 我们没有代码/参考表的标识列。_ CDE将是PK。
-----------------
创建表CUSTOMER_TEST (
客户标识INT
始终作为身份生成 (以1个nocycle noorder开头),
FNAME VARCHAR2(50 CHAR),
MNAME VARCHAR2(50 CHAR),
LNAME VARCHAR2(50 CHAR),
完整名称VARCHAR2(50字符)
)
表空间核心;

更改表客户_TEST
添加约束PK_CUSTOMER_TEST主键 (CUSTOMER_ID);
------------------
创建表性别测试 (
性别 _ cd字符 (1),
性别 _ nme VARCHAR2(50个字符),
创建时间戳 (6)
)
表空间核心;

更改表性别测试
添加约束PK_GENDER_TEST主键 (GENDER_CD,GENDER_NME);

--------
从核心选择 *。性别测试;

ALTER TABLE CUSTOMER_TEST ADD (
性别 _ cd字符 (1),
性别 _ nme VARCHAR2(50));
----------
从核心选择 *。CUSTOMER_TEST;

更改表核心。客户测试
添加约束FK_CUSTOMER_TEST_01外键 (性别 _ 光盘,性别 _ nme)
参考核心。性别测试 (GENDER_CD,GENDER_NME);
--------
插入核心。客户测试 (FNAME,MNAME,LNAME,FULL_NAME,GENDER_CD,GENDER_NME)
从DUAL中选择 'LUCKY','KUMAR','ALA','LA','M','MALE';-通过

插入核心。客户测试 (FNAME,MNAME,LNAME,FULL_NAME,GENDER_CD,GENDER_NME)
从DUAL中选择 'LUCKY','KUMAR','ALA','LA',',';-PASS (shoudl失败)
插入核心。客户测试 (FNAME,MNAME,LNAME,FULL_NAME,GENDER_CD,GENDER_NME)
从DUAL中选择 'LUCKY','KUMAR','ALA','LA','M','';-PASS (shoudl失败)

插入核心。客户测试 (FNAME,MNAME,LNAME,FULL_NAME,GENDER_CD,GENDER_NME)
从DUAL中选择 'LUCKY','KUMAR','ALA','LA',','MALE';-通过 (shoudl失败)
---
插入核心。客户测试 (FNAME,MNAME,LNAME,FULL_NAME,GENDER_CD,GENDER_NME)
从DUAL中选择 'LUCKY','KUMAR','ALA','LA','T','TEST';-失败

插入核心。客户测试 (FNAME,MNAME,LNAME,FULL_NAME,GENDER_CD,GENDER_NME)
从DUAL中选择 'LUCKY','KUMAR','ALA','LA','T',''''; -- PASS (没有Gender_cd = 'T')

从核心选择 *。性别测试;
-我想严格执行FK父表主键复合键gender_cd和gender_nme

专家解答

从文档中:

https://docs.或者acle.com/database/121/CNCPT/datainte.htm#CNCPT33335

“如果复合外键的任何列为null,则该键的非null部分不必与父键的任何相应部分匹配。”

您的选择是:

1) 在我看来,只有GENDER_CD应该是主键,而不是 (GENDER_CD,GENDER_NME)

或者

2) 在客户中声明GENDER_CD,GENDER_NME都不为空

或者

3) add a constraint specifying that either both GENDER_CD, GENDER_NME are present 或者 neither are present, eg

alter table客户添加
约束CHK检查
(
(GENDER_CD为null,GENDER_NME为null)
或者
(GENDER_CD不为空,GENDER_NME不为空)
)


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论