约束

非空约束(NOT NULL, NK)

CREATE TABLE 表名称(
列名 数据类型,
列名 数据类型 NOT NULL 
)

唯一约束(UNIQUE KEY, UK)

CREATE TABLE 表名称(
列名 数据类型,
列名 数据类型,
CONSTRAINT 约束名 UNIQUE(列名)
)

主键约束(PRIMARY KEY, PK)

主键约束 = 非空约束 + 唯一约束

CREATE TABLE 表名称(
列名 数据类型,
列名 数据类型,
CONSTRAINT 约束名 PRIMARY KEY(列名)
)

检查约束(CHECK KEY, CK)

CREATE TABLE 表名称(
列名 数据类型,
列名 数据类型,
CONSTRAINT 约束名 CHECK(列名 条件)
)

主-外键约束(FOREIGN KEY,FK)

子表的某个字段应该与父表的主键或唯一约束的字段有关联

CREATE TABLE 表名称(
列名 数据类型,
列名 数据类型,
CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 表名(列名)
)
  • 限制一:在删除主表之前,请一定要保证先删除子表。所以在删除数据表的时候应该先删除子表后再删除父表。
  • 限制二:作为外键的字段在主表之中必须具备主键约束或者是唯一约束
  • 数据的级联操作问题
    • 在删除主表数据的时候,如果存在有相应的子表数据,那么主表数据无法被删除
    • 为了方便数据的删除,提供有一个级联删除操作,在主表数据删除的时候对应的子表数据会同时删除掉,在建立 外键的时候使用 ON DELETE CASCADE 来设置。
    • 如果在删除主表数据的时候不希望子表数据被一起删除掉,则可以使用级联更新操作,使用 ON DELETE SET NULL 来设置。
 

修改约束

增加约束

此类的语法适合于唯一、主键、检查、外键约束的添加,而无法添加非空约束

ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段) [选项] ;

删除约束

ALTER TABLE 表名称 DROP CONSTRAINT 约束名称
 
 
 

序列

创建序列

CREATE SEQUENCE 序列名称 
[INCREMENT BY 步长] [START WITH 开始值]
[MAXVALUE 最大值 | NOMAXVALUE]
[MINVALUE 最小值 | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE 缓存大小 |NOCACHE]

 序列的数字字典为user_sequences

在此数据字典之中主要包含如下列的数据信息:

  • SEQUENCE_NAME:表示的序列名称,本处为 MYSEQ;
  • MIN_VALUE:表示序列的最小值,默认的序列最小值是 1;
  • MAX_VALUE:表示序列的最大值,默认序列是没有最大值,1028 已经很大了。
  • NCREMENT_BY:步长,每次增长的数据,默认的是 1;
  • CYCLE:是否为循环序列,如果是 N 表示非循环,如果是 Y 表示循环;
  • ORDER:表示序列是否排序;
  • CACHE_SIZE:序列的缓存数据;
  • LAST_NUMBER:序列最后一次的增长值。
 

当一个序列对象已经创建完成之后,那么下面就可以采用如下的两个伪列来进行序列的控制 

  • 取得序列下一个增长数据(每次调用序列值都增长指定的步长):序列.nextval;
  • 取得序列的当前数据(每次调用序列都不增长):序列.currval;
  • 在使用 currval 之前一定要首先使用 nextval,否则会出现“ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义”。 

 

 

视图

创建视图

CREATE [OR REPLACE] VIEW 视图名 AS 子查询
[WITH CHECK OPTIONI][WITH REA ONLY]

注意:从 Oracle 10g R2 版本之后出现了一个创建视图的权限问题,在这之前,scott 用户本身是具备有创建视图权限的, 但是之后就没有了,那么下面首先执行如下的语句,来实现权限的分配: 

CONN sys/change_on_install AS SYSDBA ; 
GRANT CREATE VIEW TO scott ;
CONN scott/tiger ;
  • 避免视图创建条件更新:WITHCHECK OPTION
  • 设置只读视图:WITHREAD ONLY 

注意:WITHCHECK OPTION执行更新的指令,会出现“ORA-01402: 视图 WITH CHECK OPTION where 子句违规”错误提示信息, 直接告诉用户不能够更新视图的创建条件。

使用 WITH CHECK OPTION 子句只能够保护视图的创建条件,但是其它的字段依然允许更新,这就可以使用WITH READ ONLY限制编辑操作。

 

同义词

创建同义词

同义词创建必须是管理员。用public可以让所有用户都使用该同义词,反之只能sys下使用

CREATE [PUBLIC] SYNONYM 同义词名称 FOR 用户名.表名称

  

索引

A1:为什要用索引?

Q1:假设现在 emp 表之中存在有 50W 条记录,而在第 20W 条记录之后就不会再有满足条件的数据了(sal>3000),但是 如果是全表扫描,意味着,要继续查询后面的 30W 行记录,而且都是逐行扫描(逐行判断),那么性能一定不能高。那么我们可以通过“树”的形式保存排序数据。

A2:既然要排序,为什么不用ORDER BY呢?

Q2:sql的执行顺序是from》where》select》order by。

树的结构右大左小

索引创建完成。随后再次进行 sal 查询的时候显示的不再是全表扫描,而是根据一个基数扫描。那么通过索引的 查询可以明显的提升查询性能,而索引实现的关键是这棵树的维护(树是由 Oracle 内部自行维护的)。那么继续以本程序 为例,如果说此时修改了某些雇员的工资呢?那么这棵树一定要发生变化,所有的数据都需要重新排列。那么此时配置的 索引不仅没有提升性能,反而降低了性能,所以索引是一种相对的手段,而且永恒都要记住,没有绝对的性能提升 途 径 。

 

思考题:现在有一个新闻的检索数据库,里面保存了全世界大概有 100 亿条的数据,但是此数据库由于信息的维护的问题, 所以每秒种都会发出 10 ~ 20 次的更新指令,但是为了保证查询的性能又需要设置索引,请问,你该如何设计此数据库, 以达到查询性能优秀,更新的影响又降低到最小?

  • 矛盾点:如果要想提升查询性能只能够使用索引,但是如果频繁更新,所以又会出现性能严重降低。
  • 在所有的设计上只有一个原则:“以时间换空间、以空间换时间”。可以准备出两张表、一张表作为索引的数据查 询(表 A),另外一张表作为接收传入数据(表 B);
  • 白天所有的数据都保存在表 B 之中(这之中有可能包含有一些重复数据,或一些错误的数据),而在访问量小的 时候(1:00 ~ 7:00 访问量小)将一些新的数据保存在表 A 之中,而后给它充足的时间进行索引的生成。相当于牺牲了时实 性,但是提升了整体的操作性能,而这样的设计在很多地方都可以见到,例如:你们所有 App 的访问记录。或者最早 sina 的 blog 有一个访问统计。 

 

单引号与双引号的区别

双引号

双引号的作用是:假如建立对象的时候,对象名、字段名加双引号,则示意Oracle将严格区分大小写,否则Oracl都默认大写。

单引号

  • 用来引用一个字符串常量,也就是界定一个字符串的开始和结束
  • 转义符,对紧随其后出现的字符(单引号)进行转义
  • 表示它本身,也就是它作为一个字符串的一部分而出现在一个字符串常量中
posted on 2019-09-23 15:43  Q同码  阅读(314)  评论(0编辑  收藏  举报