1、用户、模式以及模式对象
1.1、命名模式对象
模式(Schema)对象是指用户拥有的对象。
所有的模式对象名称必须遵循下列特定原则:
- 除了数据库链接名最多可以为128个字符之外,模式对象名最多为30个字符。
- 保留字不能用作对象名。
- 所有名称必须以从A到Z的一个字母打头。
- 名称只能包含字母、数字、下划线(_)、美元符号($)或hash符号(#)。
- 小写字母会被转换为大写字母。
如果在双引号中封装名称,那么就不需要遵循上述所有规则(除名称长度外),但随后获取这种对象时,必须始终使用双引号来指定对象,列名也应用相同约束。
如果没有将名称封装在双引号内,会自动将小写字母转换为大写字母。记住:对象名总是区分大小写。
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、创建表
|
此例复杂度一般,用这个例子说明一下创建表:
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子句,可以改善序列性能,不过这样会导致更多的间隔。