问题描述
嗨,
我有父表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
我有父表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不为空)
)
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
988次阅读
2025-03-17 11:33:53
Oracle DataGuard高可用性解决方案详解
孙莹
426次阅读
2025-03-26 23:27:33
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
385次阅读
2025-04-15 17:24:06
墨天轮个人数说知识点合集
JiekeXu
363次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
357次阅读
2025-04-08 09:12:48
Oracle SQL 执行计划分析与优化指南
Digital Observer
326次阅读
2025-04-01 11:08:44
Oracle 19c RAC更换IP实战,运维必看!
szrsu
295次阅读
2025-04-08 23:57:08
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
293次阅读
2025-03-24 09:42:53
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
287次阅读
2025-03-19 14:41:51
oracle定时任务常用攻略
virvle
286次阅读
2025-03-25 16:05:19