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

 
 注册
热搜:
查看: 1025|回复: 10

[每日一题] PL/SQL Challenge 每日一题:2017-11-16 唯一约束

[复制链接]
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
跳转到指定楼层
1#
发表于 2017-11-22 05:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

原始出处:


作者: Chris Saxon

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

你的应用在这张表中存储着订单信息:

create table qz_orders (
  order_id       integer not null constraint qz_order_pk primary key,
  customer_id    integer not null,
  order_datetime date not null,
  channel_id     integer not null
);

业务规则表明,一个客户在一个时间点只能够下一个订单。

下列哪些选项:

对于每个( customer_id, order_datetime )组合只允许有一行数据
并且创建了一个包含customer_id 和 order_datetime的唯一索引?

例如,当你在执行选项之后执行下列代码:

insert into qz_orders values (1, 1, date'2017-01-01', 1);

/* 下面必须报异常 */
insert into qz_orders values (2, 1, date'2017-01-01', 2);

select uniqueness
from   user_indexes
where  table_name = 'QZ_ORDERS'
and    index_name <> 'QZ_ORDER_PK';

第一个INSERT必须成功,第二个则报异常,并且查询结果是:

UNIQUENES
---------
UNIQUE

(A)
create unique index qz_order_cust_time_u on qz_orders (
  customer_id, order_datetime
);

(B)
alter table qz_orders add constraint qz_order_cust_time_u unique (
  customer_id, order_datetime
);

(C)
create index qz_order_i on qz_orders (
  customer_id, order_datetime, channel_id
);
alter table qz_orders add constraint qz_order_cust_time_u unique (
  customer_id, order_datetime
);

(D)
create index qz_order_cust_time_u on qz_orders (
  customer_id, order_datetime
);
alter table qz_orders add constraint qz_order_cust_time_u unique (
  customer_id, order_datetime
) using index qz_order_cust_time_u ;

(E)
create unique index qz_order_cust_time_chan_u on qz_orders (
  customer_id, order_datetime, channel_id
);

alter table qz_orders add constraint qz_order_cust_time_u unique (
  customer_id, order_datetime
) using index qz_order_cust_time_chan_u ;

认证徽章
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-20 16:06:45娜美
日期:2017-12-15 13:56:33技术图书徽章
日期:2017-11-17 09:13:02妮可·罗宾
日期:2017-11-17 10:43:23
2#
发表于 2017-11-22 08:48 | 只看该作者
A.B 正確
A. unique index 去限制
B. unique constraint,自動建立unique index去限制
C. qz_order_i 為 nonunique index
D. qz_order_cust_time_u 為 nonunique index
E.  alter table qz_orders add constraint qz_order_cust_time_u unique ...時會報錯,如果using unique index qz_order_cust_time_chan_u column和unique constraint column一致就能成功

使用道具 举报

回复
论坛徽章:
18
秀才
日期:2016-04-29 15:11:10秀才
日期:2017-04-05 13:27:59秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:22:59秀才
日期:2017-03-02 10:35:32秀才
日期:2017-01-20 11:06:21秀才
日期:2017-01-20 11:00:36秀才
日期:2017-01-20 11:04:31
3#
发表于 2017-11-22 17:09 | 只看该作者
追问一下:先建索引再加唯一约束或主键很常见,是否可以保证user_indexes.uniqueness是一致的?

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期: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
4#
发表于 2017-11-22 21:00 来自手机 | 只看该作者
为什么不设计成主键就是客户加时间

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
5#
 楼主| 发表于 2017-11-23 06:01 | 只看该作者
答案AB, 2楼得奖。

A: 是的,这创建了一个唯一索引。所以它的唯一属性是UNIQUE!

B:(推荐)
当你增加一个唯一约束,Oracle会隐式创建一个唯一索引来支持它。

C:
但是B仅仅发生在目标列上没有索引的时候。
如果一个索引的前导列和唯一约束的列匹配,Oracle就会用这个索引来支持约束。甚至在索引不是唯一的情况下也会这么做。

D: 此处的索引和约束列都是相同的。所以数据库会使用这个非唯一索引,甚至用不着"using index"子句。所以它是多余的。但是包含这个子句仍然有助于你将你的意图明晰化。

E: 这会首先创建一个唯一索引,它含有更多的列,然后试图用这个索引来确保其约束。但是这行不通!在这种情况下你必须用一个非唯一索引。alter table语句会报错:
"ORA-14196: Specified index cannot be used to enforce the constraint."

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
6#
 楼主| 发表于 2017-11-23 06:04 | 只看该作者
abc_gdong 发表于 2017-11-22 17:09
追问一下:先建索引再加唯一约束或主键很常见,是否可以保证user_indexes.uniqueness是一致的?

如果你建立的不是唯一索引,再加上唯一约束之后,uniqueness并不会因此改变。

但是唯一约束会起作用。非唯一索引可以让你制造延迟约束,即在DML的时候可以不唯一,等到提交事务才检查。

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
7#
 楼主| 发表于 2017-11-23 06:05 | 只看该作者
〇〇 发表于 2017-11-22 21:00
为什么不设计成主键就是客户加时间

因为这题目是要考几个不同的知识点。

使用道具 举报

回复
论坛徽章:
18
秀才
日期:2016-04-29 15:11:10秀才
日期:2017-04-05 13:27:59秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:23:10秀才
日期:2017-04-05 13:22:59秀才
日期:2017-03-02 10:35:32秀才
日期:2017-01-20 11:06:21秀才
日期:2017-01-20 11:00:36秀才
日期:2017-01-20 11:04:31
8#
发表于 2017-11-23 10:25 | 只看该作者
newkid 发表于 2017-11-23 06:04
如果你建立的不是唯一索引,再加上唯一约束之后,uniqueness并不会因此改变。

但是唯一约束会起作用。 ...

我做了如下测试:
1、建了索引
2、加唯一约束
3、我插入两条同样的数据,没有提交也报错了
请大师指点

使用道具 举报

回复
认证徽章
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-20 16:06:45娜美
日期:2017-12-15 13:56:33技术图书徽章
日期:2017-11-17 09:13:02妮可·罗宾
日期:2017-11-17 10:43:23
9#
发表于 2017-11-23 10:30 | 只看该作者
abc_gdong 发表于 2017-11-23 10:25
我做了如下测试:
1、建了索引
2、加唯一约束

測試用到的SQL能否發出下呢?

使用道具 举报

回复
认证徽章
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-20 16:06:45娜美
日期:2017-12-15 13:56:33技术图书徽章
日期:2017-11-17 09:13:02妮可·罗宾
日期:2017-11-17 10:43:23
10#
发表于 2017-11-23 10:44 | 只看该作者
abc_gdong 发表于 2017-11-23 10:25
我做了如下测试:
1、建了索引
2、加唯一约束

Sorry, 我開始沒看清,確實是您說的這樣。
這樣看來DML事務開啟時應該已經被約束限制!
也看能否做個大批量的unique值 insert 測試,看用到的uniquess index segment 是否會有增加

使用道具 举报

回复

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

本版积分规则

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