约束
一,主键(唯一,并且主键所在字段应无任何业务意义,永远不要需要修改)
方法一:Create table 表明(字段1 字段1类型 constraint 约束名 Primary Key,字段2 字段2类型…字段N字段N类型);
方法二:Alert table table_name add constraint constratint_name Primary Key(column_name[,column_name2]);
(一个表里面只有一个主键,一个主键可以有多个字段,也就是复合主键)
y
二,外键(不能连另一张表没有的字段,一般都连接另一张表的主键)
方法一:Create table 表明 (字段1 字段一类型 constraint 约束名 references State(column_name),字段2 字段2类型…字段N字段N类型);
方法二:Alert table table_name add constraint constratint_name Foreign Key(column_name) references table_name(column_name);
三,检查
方法一:Create table 表明 (字段1 字段1类型 constraint column_name check ( column_name >= x),字段2 字段2类型…字段N字段N类型);
方法二:Alert table table_name add constraint constratint_name Check( column_name >= x);
四,唯一(像 hashmap 中key 一样,不可以重复)
方法一:Create table 表明 (字段1 字段1类型 constraint column_name unique ,字段2 字段2类型…字段N字段N类型);
方法二:Alert table table_name add constraint constratint_name unique ( column_name1[,column_name2]);
方法三: Create table 表明 (字段1 字段1类型 unique ); 会产生一串随机的约束名,如果不去查找
五,激活/禁用
方法一:Alert table table_name enable[ novalidate | validate] | disable constraint constraint_name
(enable :开启 novalidate:不验证,不检测以前的数据 validate:验证,检测以前的数据)默认是validate
(disable : 禁用 )
enable 和 disable 约束将来的数据
六,删除
方法一: alert table 表名 drop constraint constraint_name
注: 1,约束名全局共享,所以要标记出表明,字段名,防止冲突
2,主键缩写pk, 外键缩写fk
3,约束在DML 操作时,检测操作是否合法,如果时大批量的dml操作,并且知道数据来源一定可靠,或者导入数据比数据安全更重要时,可以关闭约束 主表(主键表) 子表(外键表)
4,要重建主表时,临时删除主表时,子表的外键约束应该关闭或者删除
5,在删库时,应该先删除外键表,在删除主键表,否则报错
序列
一,创建
create sequence sequence_name [start with ?] [increment by ?] [minvalue ? | nominvalue ] [maxvalue n | nomaxvalue ] [ cache n | nocache] [ cycle | nocycle ] [ order |noorder]
创建 序列 序列名 开始于? 递增 ? [ 最小值?| 没有最小值 ] [最大值 ?| 没有最大值] [ 缓存数? | 没有缓存] [循环 | 不循环] [ 排序 | 不排序 ]
序列的作用是辅助技术,或者快速生成自增主键的工具
create sequence seq_demo1_pk;
[ cache n | nocache] : 是否预先缓冲一些计算好的序列值,即加好了递增值的结果。预先加载多少?
[ cycle | nocycle ] : 给定了最大最小值后,超出最大值,是否从最小值从新技术
[ order |noorder] : 是否是绝对递增
(catch → 缓存(免计算,最高速)
order → 指针,指向缓存的
速度比较: catch→ noorder→ order )
二,删除
drop sequence sequence_name
触发器
提供给程序员和数据分析员来保证数据完整性的一种方法,他是与表事件相关的特殊的存储过程,他的执行不是由程序调用,也不是手工启动,而是由事件来出发,比如当对一个表进行操作(insert , delete ,update) 时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
一,创建
create [ or replace ] **trigger** trigger_name
[ before | after | instead of ]
trigger_event
on table_name view_name | user_name | db_name
[ for each row ]
[ when trigger_condition] (判断是否执行后续的处理,这个可以在后期判断)
begin
plsql_sentences;
(解释:pl/sql编程
:new 代表 insert 的数据,update执行前的数据
:old 代表 delete 的数据, update执行后的数据
触发器可以连写,insert,delete,update。实行触发器时对这些条件进行判断,时那种状态 :if ** then ** elseif ** then endif
)
end
tri_name;
(:= 表示赋值)
触发器组成:
触发事件trigger : 引起触发器被触发的事件。例如: DML语句(insert,updatedelete 语句对表或视图执行数据处理操作)、DDL 语句( 如 create 、 alter 、drop 语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
触发时间 before | after | instead of : 即该trigger 是在触发事件发生之前(before) 还是之后(after )触发,也就是触发事件和该trigger的操作顺序。
触发操作 plsql——sentences: 即该trigger 被触发之后的目的和意图,正式触发器本身要做的事情。例如:PL/SQL 块。
触发对象 On : 包括表、视图、模式、数据库。只有在这些对象上 发生了符合条件的触发事件,才会执行触发操作。
触发条件 tri_condition : 由when 子句指定一个逻辑表达式。只有当该表达式的值为true时,遇到触发事件才会自动执行触发器使其执行触发操作。
触发频率 for each row : 说明触发器内定义的动作被执行的次数。即语句级(statement) 触发器和行级(row) 触发器。
二,使用
触发器触发次序
1,执行before 语句级触发器
2, a) 执行before 行级触发器
b) 执行dml语句
c) 执行after 行级触发器
3,执行 after 语句触发器
三,触发器序列自增长
触发器:
create or replace trigger trigger_name
before insert on table_name
for each row
begin
select sequences_name.nextval into : new pk_name dual;
10G 版本后
: new . pk_coiumn_name : = seq_name.nextval;
end trigger_name
四,触发器发生错误
raise_application_error(-20001,'下半年禁止删除仓库表数据');
五,PL/SQL的分支语句
if **** then **** endif
if **** then **** elsif **** then **** endif