ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 2945|回复: 7

[每日一题] PL/SQL Challenge 每日一题:2018-2-24 RELY约束

[复制链接]
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-3-2 04:38 | 显示全部楼层 |阅读模式

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者: Chris Saxon

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

你为一个砖块生产公司工作。你把砖块的信息存放在qz_bricks表中。你只能用批准过的颜色给砖块上色。这些颜色保存在qz_colours表:

create table qz_colours (
  rgb_hex_code varchar2(6) not null primary key
);

create table qz_bricks (
  brick_id     integer not null primary key,
  rgb_hex_code varchar2(6) not null
);

你想要确保你的砖块只能存储批准过的颜色,所以你想要增加一个外键来检验。

哪些选项创建了一个从qz_bricks 到 qz_colours的外键?

(A)
alter table qz_bricks add constraint qz_bric_colour_fk
  foreign key ( rgb_hex_code )
  references qz_colours ( rgb_hex_code ) ;

(B)
alter table qz_bricks add constraint qz_bric_colour_fk
  foreign key ( rgb_hex_code )
  references qz_colours ( rgb_hex_code )
  rely ;

(C)
alter table qz_colours modify primary key rely ;

alter table qz_bricks add constraint qz_bric_colour_fk
  foreign key ( rgb_hex_code )
  references qz_colours ( rgb_hex_code )
  rely ;

(D)
alter table qz_colours modify primary key rely ;

alter table qz_bricks add constraint qz_bric_colour_fk
  foreign key ( rgb_hex_code )
  references qz_colours ( rgb_hex_code )
  norely ;

(E)
alter table qz_bricks add constraint qz_bric_colour_fk
  foreign key ( rgb_hex_code )
  references qz_colours ( rgb_hex_code )
  rely disable ;
论坛徽章:
399
优秀写手
日期:2013-12-18 09:29:08itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2018-3-2 06:45 来自手机 | 显示全部楼层
看标题还以为是一种新的约束,原来是外键

使用道具 举报

回复
论坛徽章:
288
秀才
日期:2017-03-02 10:30:47布鲁克
日期:2016-10-08 10:06:50秀才
日期:2016-09-27 15:16:21秀才
日期:2016-09-27 15:11:30奥运会纪念徽章:自行车
日期:2016-09-26 15:54:59举人
日期:2016-06-24 09:25:21秀才
日期:2016-06-24 09:21:04双鱼座
日期:2016-06-15 17:14:38射手座
日期:2016-05-26 14:02:50白羊座
日期:2016-05-23 11:49:19
发表于 2018-3-2 11:02 | 显示全部楼层
官方手册上有一段描述,感觉不清不楚的,本质的意义还是没看懂:

RELY
The ETL process commonly verifies that certain constraints are true. For example, it can validate all of the foreign keys in the data coming into the fact table. This means that you can trust it to provide clean data, instead of implementing constraints in the data warehouse. You create a RELY constraint as follows:

  ALTER TABLE sales ADD CONSTRAINT sales_time_fk
  FOREIGN KEY (time_id) REFERENCES times (time_id)
  RELY DISABLE NOVALIDATE;
This statement assumes that the primary key is in the RELY state. RELY constraints, even though they are not used for data validation, can:

Enable more sophisticated query rewrites for materialized views.
Enable other data warehousing tools to retrieve information regarding constraints directly from the Oracle data dictionary.
Creating a RELY constraint is inexpensive and does not impose any overhead during DML or load. Because the constraint is not being validated, no data processing is necessary to create it

使用道具 举报

回复
论坛徽章:
288
秀才
日期:2017-03-02 10:30:47布鲁克
日期:2016-10-08 10:06:50秀才
日期:2016-09-27 15:16:21秀才
日期:2016-09-27 15:11:30奥运会纪念徽章:自行车
日期:2016-09-26 15:54:59举人
日期:2016-06-24 09:25:21秀才
日期:2016-06-24 09:21:04双鱼座
日期:2016-06-15 17:14:38射手座
日期:2016-05-26 14:02:50白羊座
日期:2016-05-23 11:49:19
发表于 2018-3-2 11:06 | 显示全部楼层
我猜,是 AC

使用道具 举报

回复
发表于 2018-3-2 11:10 | 显示全部楼层
ABCD
RELY约束,没看明白什么意思,刚试了一下没什么影响,好像建立约束的时候就默认rely?
E那个 disable 导致约束无效

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
发表于 2018-3-2 14:59 | 显示全部楼层
ACD                                                         

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有车
日期:2014-02-18 16:41:11itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31
发表于 2018-3-2 15:11 | 显示全部楼层
rely是“信任”的意思
一个约束如果是rely的,那么通常该约束是为NOVALIDATE状态的(即不做检查),在这种情况下,只要我指明了外键关系,oracle并不去校验数据是否真的符合外键约束,哪怕有违规的数据进入子表,oracle也不会报错。然而,oracle依旧信任这外键约束关系是存在的。

需要注意区分约束的rely/norely, VALIDATE/noVALIDATE, ENABLE/DISABLE几种属性
ENABLE/DISABLE 是启用/禁用约束
VALIDATE/noVALIDATE 是是否验证已存在的数据是否符合约束
这二者经常一起使用
ENABLE VALIDATE:新旧数据都验证是否符合约束
ENABLE NOVALIDATE:只验证新数据是否符合约束
DISABLE VALIDATE:不使用约束,但让Oracle认为约束是合法的(通常用在DW环境中,节省约束索引所占的空间)
DISABLE NOVALIDATE:Oracle不维护约束,同时也不保证约束为true

所以根据上述描述,正确的答案为:ACD
A、正确,严格的外键约束关系
B、只指明外键为rely,但主键不是rely的会报错:ORA-25158: 如果相关主键为 NORELY, 则无法为外键指定 RELY
C、正确,只是改为rely状态,但validate状态依然是有效的,所以依然可以严格保证只能插入合法数据
D、正确,约束默认就是norely模式
E、错误,约束都禁用掉了,当然就无法保证数据的有效性了

使用道具 举报

回复
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
 楼主| 发表于 2018-3-3 06:12 | 显示全部楼层
答案ACD, 7楼得奖。

A:(推荐)
是的,这会创建一个常规的从qz_bricks 到 qz_colours的外键约束。
B: 为了创建一个RELY状态的外键,它所引用的主键必须也是RELY。缺省这个约束不是RELY的。所以这会报错:
"ORA-25158: Cannot specify RELY for foreign key if the associated primary key is NORELY"
C: 这个选项首先把qz_colours的主键变成RELY, 所以你也可以将指向它的外键创建为RELY状态。
D: 你可以将一个NORELY的外键执行一个RELY的主键。这没问题。
E: 这会试图创建一个屏蔽的RELY约束。但是即使它是屏蔽的,它仍然需要qz_colours的主键设为RELY。而它不是。所以这会报错:
"ORA-25158: Cannot specify RELY for foreign key if the associated primary key is NORELY".

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表