字段约束
约束类型:
- UNIQUE (唯一性约束)
- NOT NULL (非空约束)
- CHECK (自定义约束)
- PRIMARY KEY (主键约束)
- FOREIGN KEY (外键约束)
外键策略:
- 默认:存在外键的主键表列数据不允许被删除
- ON DELETE CASCADE:级联删除,主键表列数据被删除时,外键表对应列数据也被删除
- ON DELETE SET NULL:主键表列数据被删除时,外键表对应列数据会变成null
创建表时同时创建约束
1 | --主键表 |
单独创建约束(增加主外键约束用Add,其他用Modify )
1 | ALTER TABLE Tablenamepk Modify Deptno NOT NULL; |
失效\启用\ 删除约束
1 | ALTER TABLE Tablenamefk DISABLE CONSTRAINT Tablenamefk_Fk;--失效 |
临时表
临时表中保存的数据只对当前会话有效,即使提交了事务在别的会话中也看不到数据
- 会话级-PRESERVE:会话临时表执行commit和rollback操作得到效果和一般表是一样的,但是表中数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据
- 事务级-DELETE:执行commit和rollback操作时会清除表中数据
1 | CREATE Global Temporary TABLE Temptable(Id NUMBER) ON COMMIT PRESERVE/DELETE ROWS; |
分区表
优点:
- 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度
- 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用
- 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可
- 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能
- 缺点:已经存在的表没有方法可以直接转化为分区表
范围分区表
每一个分区都必须有一个VALUES LESS THEN子句,分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个的分区中。除了第一个分区,其他分区都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。如果指定MAXVALUE,这个值高于其它分区中的任何分区键的值,同时包括空值。
1 | CREATE TABLE Area_Range( |
增加分区
1 | --有MAXVALUE分区条件时创建分区 |
删除分区
1 | ALTER TABLE Area_Range DROP PARTITION part20180101; |
列表分区表
某列的值只有确定的几个,基于这样的特点可以采用列表分区
1 | CREATE TABLE List_Range( |
增加分区
1 | ALTER TABLE List_Range ADD PARTITION part03 VALUES ('OM'); |
修改分区列表值
1 | ALTER TABLE List_Range MODIFY PARTITION part03 ADD VALUES('GL'); |
删除分区
1 | ALTER TABLE List_Range DROP PARTITION part03; |
哈希分区表
当列的值没有合适的条件时,建议使用散列分区,随机的插入到某个区中,不受人为的干预,因为通过在I/O设备上进行散列分区,使得这些分区大小一致
1 | CREATE TABLE Hash_Range( |
增加分区
1 | ALTER TABLE Hash_Range ADD PARTITION part03; |
删除分区
一次减少一个,不能指定减少partition的名称
1 | ALTER TABLE Hash_Range COALESCE PARTITION; |
其他操作
查询指定分区
1 | SELECT * FROM Area_Range PARTITION(Part20171201); |
查询分区信息
1 | SELECT * FROM Sys.User_Tab_Partitions t WHERE t.Tablespace_Name = 'APPS' AND t.Table_Name = 'AREA_RANGE'; |
分区合并
1 | ALTER TABLE Area_Range MERGE PARTITIONS part20171101,part20171201 INTO PARTITION part20171201 |
如果分区合并最后没添加update indexes子句的话,可以重建受影响的分区的索引
1 | ALTER TABLE Area_Range MODIFY PARTITION part20171201 REBUILD UNUSABLE LOCAL INDEXES; |
分区改名
1 | ALTER TABLE Hash_Range RENAME PARTITION PART01 TO PART02; |
物化视图
物化视图主要是用于分布式数据库,在数据库B中要使用数据库A中a表,先在A数据库建立DBLINK,并在数据库B中创建数据库A中a表的物化视图,提高查询效率
刷新方式:
- FAST:快速刷新,利用SNAPSHOT LOG只更新时间段变动部分
- COMPLETE:完全刷新
- FORCE:自动判断刷新,介于FAST和COMPLETE之间
如果是FAST方式需要在A数据库建立Snapshot日志,否则跳过此步骤
1 | CREATE SNAPSHOT Log ON Emp WITH ROWID; |
创建物化视图
1 | CREATE SNAPSHOT C##apps_Emp_c REFRESH COMPLETE START |
修改物化视图
1 | ALTER SNAPSHOT C##apps_Emp_c REFRESH COMPLETE START |
查看物化视图最后刷新的日期
1 | SELECT * FROM All_Snapshot_Refresh_Times; |
手动刷新物化视图(F:FAST、C:COMPLETE)
1 | BEGIN |
DBLINK
查询用户是否有创建DBLINK权限
1 | SELECT * FROM User_Sys_Privs WHERE Privilege LIKE Upper('%DATABASE LINK%'); |
使用 sysdba 角色给用户赋权
1 | GRANT CREATE PUBLIC DATABASE LINK TO C##APPS; |
创建DBLINK
DBLINK分为公有和私有两类,公有dblink对所有人开放,私有dblink只有创建者可以访问。公有DBLINK使用PUBLIC修饰关键字。在CREATE和DROP的时候都需要使用PUBLIC,如:DROP PUBLIC DATABASE LINK 或者DROP DATABASE LINK
1 | --方法一:要求数据库服务器 A上tnsnames.ora中有数据库B的映射 |
DBLINK表查询
1 | SELECT * FROM tablename@tablename_dbl; |
查询已建立的DBLINK
1 | SELECT * FROM All_Db_Links; |
删除DBLINK
1 | DROP DATABASE LINK tablename_dbl; |

定时任务
查询定时任务
1 | SELECT Uj.Job 唯一标示 |
设置定时任务
1 | DECLARE |
表链接
(+)
外链接,与JION用法类似,区别在于不能实现多表外链接
1 | SELECT a.Empno |

JOIN
LEFT JOIN
左外连接(LEFT OUTER JOIN 或 LEFT JOIN )
1 | SELECT a.Empno |

RIGHT JOIN
右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN)
1 | SELECT a.Empno |

INNER JOIN
内连接,取两表交集(INNER JOIN 或 JOIN)
1 | SELECT a.Empno |

FULL JOIN
全连接,取两表并集(FULL OUTER JOIN 或 FULL JOIN)
1 | SELECT a.Empno |

全连接,取两表无交集
1 | SELECT a.Empno |

CROSS JOIN
交叉连接(CROSS JOIN):结果集是个笛卡尔乘积
1 | SELECT e.Empno |
UNION
取并集
- UNION :结果集去除重复记录
- UNION ALL:结果集保留重复记录

1 | SELECT e.Ename |
INTERSECT
取交集
1 | SELECT e.Deptno |
MINUS
取差集
1 | SELECT d.Deptno FROM Dept d MINUS SELECT e.Deptno FROM Emp e; |
触发器
触发器记录表操作日志
1 | CREATE OR REPLACE TRIGGER Tablenamelog_Tri |