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

 找回密码
 注册
查看: 821|回复: 3

[每日一题] PL/SQL Challenge 每日一题:2016-12-24 非空约束

[复制链接]
论坛徽章:
449
秀才
日期:2015-08-18 09:49:27秀才
日期:2015-10-10 11:14:46秀才
日期:2015-10-10 11:14:46秀才
日期:2015-10-10 11:14:46举人
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01
发表于 2016-12-29 05:02 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

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

作者:        ChrisSaxon

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

你老板叫你实现如下的表:

表名:PLCH_NASA_SPACE_MISSIONS
列名:
MISSION_ID INTEGER
MISSION_NAME VARCHAR2(100)
LAUNCH_DATE DATE
主键:PLCH_NASA_SPACE_MISSION_PK (MISSION_ID)

Mission_id, mission_name 和 launch_date 都是必需的,也即,它们不能含有NULL值。

哪些选项创建了表,并且使得下列三个插入语句都会抛出异常?

insert into plch_nasa_space_missions
  values (1, 'Apollo 11', null);
insert into plch_nasa_space_missions
  values (null, 'Apollo 12', date'1969-11-14');
insert into plch_nasa_space_missions
  values (2, null, date'1970-04-11');

(A)
create table plch_nasa_space_missions (
  mission_id   integer,
  mission_name varchar2(100) not null,
  launch_date  date not null,
  constraint plch_nasa_space_mission_pk primary key ( mission_id )
);

(B)
create table plch_nasa_space_missions (
  mission_id   integer
    constraint plch_nasm_mission_id_nn not null,
  mission_name varchar2(100)
    constraint plch_nasm_name_nn not null,
  launch_date  date
    constraint plch_nasm_launch_date_nn not null,
  constraint plch_nasa_space_mission_pk primary key ( mission_id )
);

(C)
create table plch_nasa_space_missions (
  mission_id   integer,
  mission_name varchar2(100),
  launch_date  date,
  constraint plch_nasa_space_mission_pk primary key ( mission_id ),
  constraint plch_nasm_columns_nn check (
    mission_name is not null and
    launch_date is not null and
    mission_id is not null
  )
);

(D)
create table plch_nasa_space_missions (
  mission_id   integer,
  mission_name varchar2(100),
  launch_date  date,
  constraint plch_nasa_space_mission_pk primary key ( mission_id )
);

alter table plch_nasa_space_missions add constraint
  plch_nasm_mission_id_nn not null ( mission_id );
  
alter table plch_nasa_space_missions add constraint
  plch_nasm_name_nn not null ( mission_name );
  
alter table plch_nasa_space_missions add constraint
  plch_nasm_launch_date_nn not null ( launch_date );

(E)
create table plch_nasa_space_missions (
  mission_id   integer mandatory,
  mission_name varchar2(100) mandatory,
  launch_date  date mandatory,
  constraint plch_nasa_space_mission_pk primary key ( mission_id )
);
认证徽章
论坛徽章:
1
秀才
日期:2017-01-20 11:04:31
发表于 2016-12-29 09:35 | 显示全部楼层
答案是ABC
A,B,C都设置了字段 not null,主键,check,能保证字段非空。
D,E这写的语法有问题

使用道具 举报

回复
论坛徽章:
6
秀才
日期:2017-01-20 11:04:31秀才
日期:2017-01-20 11:06:21技术图书徽章
日期:2017-01-20 11:06:21秀才
日期:2016-12-05 11:16:06技术图书徽章
日期:2016-12-05 11:16:40秀才
日期:2016-12-05 11:16:40
发表于 2016-12-29 09:58 | 显示全部楼层
ABC
C MISSION_ID作为主键不能为空,mission_name和launch_date则是由于检查约束报错
D 只有插入mission_id 为空时报错,因为后面三条添加非空约束的语法出错,实际上只给表添加了主键约束,添加非空约束应该用modify
E 不知道mandatory是什么,建表的时候就报错了

使用道具 举报

回复
论坛徽章:
449
秀才
日期:2015-08-18 09:49:27秀才
日期:2015-10-10 11:14:46秀才
日期:2015-10-10 11:14:46秀才
日期:2015-10-10 11:14:46举人
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01
 楼主| 发表于 2016-12-30 03:51 | 显示全部楼层
答案ABC, 2楼得奖。

A: mission_id上并没有非空约束。但这个列是主键。主键不能存储空值。所以这满足了需求。
B: (推荐)
这会在所有列上创建带名字的非空约束。
C: (不推荐)
这会创建一个单独的检查约束来校验所有的列非空。
D: 你不能够创建表级别的非空约束。alter table语句会报错:
"ORA-00904: : invalid identifier"

为了加上这些约束你需要修改列,比如:

alter table plch_nasa_space_missions modify (launch_date constraint plch_nasm_launch_date_nn not null);

或者:
alter table plch_nasa_space_missions modify (launch_date not null);

E:
在ORACLE中不存在 "mandatory"关键字。建表语句会报错:
"ORA-00907: missing right parenthesis"

使用道具 举报

回复

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

本版积分规则

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