查看: 281|回复: 2

[每日一题] PL/SQL Challenge 每日一题:2019-9-6 索引

[复制链接]
论坛徽章:
534
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-9-12 02:50 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

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

作者:Chris Saxon

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

你创建了如下的表来存储足球比赛信息:

create table qz_football_matches (
  home_team_id   integer not null,
  away_team_id   integer not null,
  location_id    integer not null,
  match_datetime timestamp with time zone
);

下列哪些选项会在这张表上创建一个索引?

(A)
alter table qz_football_matches
  add constraint qz_football_match_pk
  primary key (
    home_team_id, match_datetime
  );

(B)
alter table qz_football_matches
  add constraint qz_football_match_u
  unique (
    away_team_id, match_datetime
  );
(C)
create unique index qz_football_match_ui
  on qz_football_matches (
    away_team_id, match_datetime
  );

(D)
create index qz_football_match_i
  on qz_football_matches (
    match_datetime
  );

(E)
create bitmap index qz_football_match_bi
  on qz_football_matches (
    location_id, match_datetime
  );
论坛徽章:
468
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2019-9-12 09:25 | 显示全部楼层

答案 CDE

A: ORA-02329: column of datatype TIME/TIMESTAMP WITH TIME ZONE cannot be unique or a primary key
   timestamp/TIMESTAMP WITH TIME ZONE 不存储时区信息,使得不同时区的相同时间值会重复,违反唯一性
   字段定义 match_datetime timestamp with time zone 如果改成 match_datetime timestamp with local time zone 就可以
   
B: ORA-02329: column of datatype TIME/TIMESTAMP WITH TIME ZONE cannot be unique or a primary key
   A是主键约束,这里是唯一约束,也不行
   
C: 这里表为空,只要away_team_id, match_datetime这个组合字段没有重复值,都可以建唯一索引
D: 常规索引,没有限制,没有问题
E: 位图索引,一般是为数据仓库设计的,一般建立在低基数的列,这里没数据也没有什么限制,没有问题

使用道具 举报

回复
论坛徽章:
534
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2019-9-13 05:04 | 显示全部楼层
答案CDE, 2楼得奖。

A: match_datetime 的数据类型是TIMESTAMP WITH TIME ZONE。你不能将这种类型用于主键。所以这会报错:
  "ORA-02329: column of datatype TIME/TIMESTAMP WITH TIME ZONE cannot be unique or a primary key".
B: 你不能将TIMESTAMP WITH TIME ZONE用于唯一约束。所以这也会报错:
"ORA-02329: column of datatype TIME/TIMESTAMP WITH TIME ZONE cannot be unique or a primary key".

C: 但是你能够在TIMESTAMP WITH TIME ZONE上面创建唯一索引!

D: 你也可以在TIMESTAMP WITH TIME ZONE类型的列上建立标准索引。

E: 你可以在TIMESTAMP WITH TIME ZONE列上创建位图索引。

----------
注:可以增加虚拟列,用sys_extract_utc变成不带时区的timestamp然后就可以创建唯一约束或主键。

使用道具 举报

回复

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

本版积分规则 发表回复

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