OCP认证考试指南(8):管理数据库对象

1、用户、模式以及模式对象

1.1、命名模式对象

模式(Schema)对象是指用户拥有的对象。

所有的模式对象名称必须遵循下列特定原则:

  • 除了数据库链接名最多可以为128个字符之外,模式对象名最多为30个字符。
  • 保留字不能用作对象名。
  • 所有名称必须以从A到Z的一个字母打头。
  • 名称只能包含字母、数字、下划线(_)、美元符号($)或hash符号(#)。
  • 小写字母会被转换为大写字母。

如果在双引号中封装名称,那么就不需要遵循上述所有规则(除名称长度外),但随后获取这种对象时,必须始终使用双引号来指定对象,列名也应用相同约束。

如果没有将名称封装在双引号内,会自动将小写字母转换为大写字母。记住:对象名总是区分大小写。

SQL> create table lower ( lid int );
 
Table created.
 
SQL> create table "lower" ( lid int );
 
Table created.
 
SQL> select table_name from dba_tables
  2  where lower(table_name) = 'lower';
 
TABLE_NAME
------------------------------
LOWER
lower

可以看到,两个表完全不同。

1.2、对象命名空间

对象的唯一标识符是前缀为模式名的对象名。命名空间(namespace)定义了一组对象类型,这组对象类型内的所有名称都必须通过模式与名称被唯一标识。不同命名空间内的对象能共享相同的名称。

下列对象类型能够共享相同的命名空间:

  • 视图
  • 序列
  • 私有的同义词
  • 独立的过程
  • 独立的存储函数
  • 程序包
  • 物化视图
  • 自定义类型

因此,我们无法创建一个与某个表具有相同名称的视图,至少在二者存在于相同模式内的情况下是不可能的。

下列对象类型分别具各自的命名空间:

  • 索引
  • 约束
  • 群集
  • 数据库触发器
  • 私有的数据库链接

2、数据类型

用于文字数字式数据的数据类型

数据类型说明
VARCHAR2长度为1字节到4K的字符数据。数据被存储在数据库字符集内
NVARCHAR2与VARCHAR2一样,不过数据被存储在别国语言字符集内,字符集是经过许可的Unicode字符集
CHAR数据库字符集内固定长度的数据。这种数据的长度不为列的长度,那么就需要填充空格
RAW长度为1字节到2K可变的二进制数据。与CHAR和VARCHAR数据类型不一样,Oracle Net无法通过选择或其他插入方式将RAW类型数据从数据库的字符集转换为用户进程的字符集

用于数值数据的数据类型(全部具有可变长度)

数据类型说明
NUMBER可以指定精度和刻度的数值数据。精度范围1~38,刻度范围-84~127
FLOAT这是一种ANSI数据类型,用于精度为126位二进制数的浮点数
INTGER刻度相当于0的NUMBER类型

为了与ISO/ANSI一致,可以指定VARCHAR数据类型,但这种数据类型的任何列都被自动转换为VARCHAR2类型。

日期和时间数据的数据类型(全部具有固定长度)

数据类型说明
DATE长度可以为0(列为空),也可以为7个字节。所有DATE数据包括世纪、年、月、日、小时、分钟和秒
TIMESTAMP长度可以为0(列为空),也可以到11个字节(取决于指定精度)。与DATE类型相似,不过用于秒的精度最大可以达到小数点后9位(默认6位)
TIMESTAMP WITH TIMEZONE与TIMESTAMP一样,不过数据必须用所涉及的时区记录进行存储。长度最大13字节。即使两个时间用于不同时区,这类型也会通过数据规格化为UTC来确定两个时间的差异
TIMESTAMP WITH LOCAL TIMEZONE与TIMESTAMP一样,不过数据存储时会被规格化为数据库时区形式。检索时,数据会被规格化为用户进程选中的时区形式
INTERVAL YEAR TO MONTH用以年和月为单位记录两个DATE类型数据或两个TIMESTAMP类型数据之间的时间长度
INTERVAL DAY TO SECOND用于以日和秒为单位记录两个DATE类型数据或两个TIMESTAMP类型数据之间的时间长度

大对象数据类型

数据类型说明
CLOB存储在数据字符集中的字符数据,大小几乎不受限制(数据块大小与4G的乘积)
NCLOB与CLOB一样,不过数据被存储在别国语言字符集内,字符集是经过许可的Unicode字符集
BFILE指向数据库服务器的操作系统中存储的某个文件的定位器。文件大小被限制在4G内
LONG数据库字符集内的字符数据,最大长度2G。CLOB提供了LONG类型的所有功能(以及更多功能)。不推荐用该类型了。
LONG RAW会被转为BLOB类型,也不推荐用了。

3、创建表

SQL> create table emp (
  2  empno number(6)
  3  constraint emp_empno_pk primary key
  4  using index
  5  (create index emp_empno_pk on emp(empno) tablespace mydemo),
  6  firstname varchar2(20),
  7  lastname varchar2(25)
  8  constraint emp_last_name_nn not null,
  9  hire_date date default sysdate,
 10  salary number(8, 2),
 11  managerid number(6)
 12  constraint emp_managerid_fk references emp(empno),
 13  photo blob,
 14  resume clob,
 15  email varchar2(25),
 16  constraint emp_salary_min check (salary >= 0),
 17  constraint emp_email_uk unique (email))
 18  lob (photo, resume) store as
 19  (tablespace mydemo chunk 4096);
 
Table created.

此例复杂度一般,用这个例子说明一下创建表:

2、3、4、5:定义数值列EMPNO,并被用作主键,没有设置默认主键索引,而是使用USING INDEX指定一条完整索引创建命令。
7、8:创建一个NOT NULL约束。
9:日期类型列并有默认值。
10:数值列,精度达到小数点后2位。
11、12:创建一个外键约束列。
13、14:创建两个大对象列。
16、17:在前面定义的两个列上创建约束。UNIQUE约束会使用默认设置来影响索引的创建。
18、19:为上述大对象指定一些存储选项。

4、创建约束

Oracle支持下列约束:

  • UNIQUE:对于UNIQUE列来说不可能存在具有相同值的两条记录。不过,这列允许存在NULL值,事实上多条记录都可以具有NULL值。
  • NOTNULL:非空,列必须有一个值。
  • PRIMARY KEY:主键是定位记录的手段,值必须同时满足UNIQUE和NOT NULL约束。
  • CHECK:实施简单原则,例如值的范围。NOT NULL约束内部实现实际是预配置的CHECK约束。

    5、创建索引

    索引具有双重目的:增强检索记录的性能,实施约束。

    使用CREATE INDEX命令创建索引。

    SQL> create table test ( tid number(6), tname varchar(20));
     
    Table created.
     
    SQL> create index name_id_pk on test(tid);
     
    Index created.
     
    SQL> select index_name from dba_indexes
      2  where table_name='TEST' and owner='SYS';
     
    INDEX_NAME
    ------------------------------
    NAME_ID_PK

    6、创建视图

    视图(VIEW)是向用户显示数据的一种手段。视图实际上是一个查询,也就是存储在数据字典内的一条SELECT语句。是否对一个视图执行DML语句,取决于视图的查询复杂程度。

    SQL> create table bb (
      2  bid number(6) primary key,
      3  bname varchar(10));
     
    Table created.
     
    SQL> insert into bb values (1, 'bb1');
    SQL> insert into bb values (2, 'bb2');
    SQL> insert into bb values (3, 'bb3');
    SQL> insert into bb values (4, 'bb1');
    SQL> insert into bb values (5, 'bb1');
    SQL> insert into bb values (6, 'bb1');
     
    SQL> create table aa (
      2  aid number(6)
      3  constraint aa_aid_pk primary key
      4  using index (
      5  create index aa_aid_pk on aa(aid) tablespace mydemo),
      6  aname varchar(20),
      7  bid number(6)
      8  constraint bb_bid_fk references bb(bid));
     
    Table created.
     
    SQL> insert into aa values (1, 'aa1', 1);
    SQL> insert into aa values (2, 'aa2', 1);
    SQL> insert into aa values (3, 'aa1', 1);
    SQL> insert into aa values (4, 'aa2', 4);
    SQL> insert into aa values (5, 'aa1', 5);
    SQL> insert into aa values (6, 'aa2', 6);
     
    SQL> create view a as
      2  select aid, aname from aa;
     
    View created.
     
    SQL> select * from a;
     
           AID ANAME
    ---------- --------------------
             1 aa1
             2 aa2
             3 aa1
             4 aa2
             5 aa1
             6 aa2
     
    6 rows selected.
     
    SQL> delete from a where aid = 2;
     
    1 row deleted.
     
    SQL> create view ab as
      2  select sum(aid) aid, bname from aa 
      3  join bb on aa.bid = bb.bid
      4  group by bname;
     
    View created.
     
    SQL> select * from ab;
     
           AID BNAME
    ---------- ----------
            19 bb1
     
    SQL> update ab set aid = 10;
    update ab set aid = 10
           *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view

    上面就可以看出,简单VIEW做DML操作是没有问题的,太复杂就会报异常了。

    7、创建与使用序列

    典型数据库中存在许多需要唯一数字的情况,通常情况针对的是主键。

    SQL> create sequence inv_nos start with 1 increment by 1;
     
    Sequence created.
     
    SQL> select inv_nos.nextval from dual;
     
       NEXTVAL
    ----------
             1
     
    SQL> select inv_nos.nextval from dual;
     
       NEXTVAL
    ----------
             2

    通过在创建序列时使用CACHE子句,可以改善序列性能,不过这样会导致更多的间隔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值