数据库操作(十)

正课:
1、约束
为数据库对象。
对把数据库表中的字段类型,实现数据插入的限制条件。
也会附带着其他的约束:如绑定。

主键、外键、非空、唯一、检查约束。
1)、主键约束
主键:对表中的记录数据,进行唯一标识。
主键与表中的业务字段没有关系,主键不参与业务操作。
仅用于标识某条记录在表中存在的唯一性。

主键:primary key

    ①、在建表的时候直接给字段添加主键。
        如:员工编号,在员工表中的存在,就能作为主键。
        --员工表基础数据录入 
    CREATE TABLE emp1(
            empno NUMBER(4) primary key,--设置主键约束
            ename VARCHAR2(10),
            job VARCHAR2(9),
        mgr NUMBER(4),
            hiredate DATE,
            sal NUMBER(7,2),
            comm NUMBER(7,2),
            deptno number(2)
    );
    
    ②、给建好的表,追加主键约束
        alter table 表名
        add primary key(字段名);

        如:alter table emp add primary key(empno);

注意:联合主键
对于表中的两个以上的字段,联合查询,才能对
某条记录数据确定其唯一性。

可以定义成联合主键(不常用)。

2)、外键约束
对表1插入数据的时候,受到表2数据的限制。
表2必定在表1中,有字段约束。
则表1中对应的表2字段,可以作为外键约束。

外键约束,表1中的外键必须是表2中的主键(联合主键)。
如:emp表中的deptno可以作为外键,
受到dept表中的deptno字段的约束。

    ①、在建表的时候直接给字段添加外键。
    CREATE TABLE emp1(
            empno NUMBER(4) primary key,--设置主键约束
            ename VARCHAR2(10),
            job VARCHAR2(9),
        mgr NUMBER(4),
            hiredate DATE,
            sal NUMBER(7,2),
            comm NUMBER(7,2),
            deptno number(2),
        --设置外键约束
        foreign key(deptno) references dept(deptno)
    );
注:外键约束字段,必须是关联表中的主键。

a、添加emp数据时,外键值deptno
    必须在关联表中存在对应的主键值deptno。
b、删除关联表dept数据时,
    必须在emp表中找不到关联的子记录。

②、给建好的表,追加外键约束
alter table 表名
    add foreign key(字段)
    references 外表名(主键字段);

如:
alter table emp
    add foreign key(deptno)
    references dept(deptno);

3)、非空约束
not null
限制数据库表中字段在插入数据时,不能为null值。

CREATE TABLE emp1(
        empno NUMBER(4) primary key,--设置主键约束
        ename VARCHAR2(10) not null,--设置非空约束
        job VARCHAR2(9),
    mgr NUMBER(4),
        hiredate DATE,
        sal NUMBER(7,2),
        comm NUMBER(7,2),
        deptno number(2),
    --设置外键约束
    foreign key(deptno) references dept(deptno)
);

注意:主键约束也必须是非空约束

4)、唯一约束

    unique
    限制数据库表中字段在插入数据时,不能为表中重复的值。
    CREATE TABLE emp1(
            empno NUMBER(4) primary key,--设置主键约束
            ename VARCHAR2(10) not null,--设置非空约束
            job VARCHAR2(9) unique,--设置唯一约束
        mgr NUMBER(4),
            hiredate DATE,
            sal NUMBER(7,2),
            comm NUMBER(7,2),
            deptno number(2),
        --设置外键约束
        foreign key(deptno) references dept(deptno)
    );
    
    注意:主键约束也必须是唯一约束

5)、检查约束

    check
    限制数据库表中字段在插入数据时,必须符合一定的规范。
    CREATE TABLE emp1(
            empno NUMBER(4) primary key,--设置主键约束
            ename VARCHAR2(10) not null,--设置非空约束
            job VARCHAR2(9) check(length(job)>3),--设置检查约束
        mgr NUMBER(4),
            hiredate DATE,
            sal NUMBER(7,2),
            comm NUMBER(7,2),
            deptno number(2),
        --设置外键约束
        foreign key(deptno) references dept(deptno)
    );

注意:非空约束其实也是一种检查约束。
结论:
约束,是用来限制向数据库表中字段插入数据,
必须符合一定的规范。否则不予插入。
附带的在数据增删改,都要满足约束设置的规范。
约束对于开发来说,是个麻烦。
为了方便开发,所以在开发前,对数据库设计时,
可以提前的将约束都设计完毕,但不要将约束添加
到数据库中。

在测试阶段的中后期,可以将所有的约束条件,添加
到数据库中,并完成最终的测试及修改。

2、视图(view)
view:也为数据库对象。
视图的结构与表相似,所以又被称为虚表,即虚拟的表。
但是其数据来源于真实的表中。
视图对应一条查询语句,把查询的结果数据,以表的形式
存储在视图中。组成视图数据的来源表,叫做基表.
一旦基表中的数据发生变化,则视图中的结果集必然
会跟着变化。

在一定程度上,视图可以实现:
a、简化查询(重用查询结果)
可将复杂查询sql的结果集,提前查询
并存放在视图中。需要的时候,直接查询
视图即可。

b、限制数据的访问。
select * from emp;
所有字段都被看到,包括sal工资。
可以将除工资以外的所有数据,存放在视图中
对外暴露。让外界只查视图,对员工薪资进行保护。

1)、创建视图
create view 视图名
as (select 子查询);

create view emp_view 
   as (
    select empno,ename,job,mgr,hiredate,deptno 
    from emp
   );


创建视图,必须授予创建视图权限。
grant create view to ksxx_21;

视图的查询与表一致。
select * from emp_view;

2)、视图分类
根据视图的复杂程度,可以分为:
简单视图:
select 基于单表操作,且不包含任何函数、
运算符、表达式、分组函数、distinct....

    select 字段名... from 表名;

复杂视图:
    select 基于单表操作,可包含函数、
    运算符、表达式、分组函数、distinct、
    group by....

连接视图:
    select 查询基于多表联合查询。

3)、创建视图添加别名

    create view emp_view2 
       as (
        select empno 员工编号,ename 姓名,
        job 职位,mgr 领导编号,hiredate 入职日期,deptno 部门编号 
        from emp
       );

    --创建复杂视图
    create view sal_view 
        as (select sal,sal*12 from emp);

则查询视图后,显示的字段直接为别名。
一定程度上,是对数据来源,进行保护。

4)、对视图进行DML操作。
视图为虚表,支持DML操作,但有诸多限制,不建议操作。

对视图进行DML操作,必须遵守以下基本原则:

a、只能对简单视图进行DML操作,
    复杂、连接视图无法实现DML操作。
b、对视图进行DML操作,必须遵循基表中的约束条件。
c、插入时,允许插入非视图范围内的数据。
    但视图查不到,在基表中存在。
d、删除、修改时,必须为视图范围内的数据。

5)、删除视图
drop view 视图名;
drop view emp1_view;

6)、为视图添加约束
①、检查约束
with check option;
为视图添加检查约束,对视图进行DML操作时,
必须遵循以下原则:
a、向视图中添加的数据,必须是视图可见数据。
b、修改视图时,修改之后的数据,必须是
视图可见数据。

否则以上DML操作失效。

②、只读约束
with read only;
为视图添加只读约束,对视图将只能查,
不能进行DML操作。

结论:
①、允许对简单视图进行DML操作,
但实际开发中,这样的操作很少很少。

②、复杂视图、连接视图不能执行DML操作。

③、对简单视图进行DML操作,必须遵循以上级别规则。

3、序列(sequence)
数据库对象
用于生成一组数字,用于生成某表的主键值。
通常情况下,一个序列只会给一张表生成主键值,
但也可以给多个表提供主键值。

1)、创建序列

    create sequence 序列名
        start with i
        increment by j
        maxvalue m|nomaxvalue(默认)
        minvalue n|nominvalue(默认)
        cycle|nocycle(默认)
        cache(默认 20)|nocache

    create sequence emp_empno_seq
        start with 1
        increment by 1;

2)、序列使用
select 序列名.nextval from dual;

如:select emp_empno_seq.nextval from dual;
    获得当前序列值,并将指针指向下一个序列值。

序列的nextval,一但当前值被获取,就不可能重复取值。
犹如时间一样,一去不复返。

向表中插入由序列生成的主键值。
insert into emp values(emp_empno_seq.nextval,'ADAMS','CLERK',7788,to_date('23-5-87','dd-mm-yyyy'),1100,null,20);

3)、删除序列
drop sequence 序列名;

drop sequence emp_empno_seq;

4、索引(index)
数据库对象
一种提高查询效率的机制。

1)、创建索引
给对应的字段创建索引
create index 索引名 on 表名(字段名);

create index emp_empno_index on emp(empno);

2)、索引使用
根本无需使用。
只管创建即可,会在查询的时候,根据查询的sql,
自动调用索引,来提高查询效率。

3)、合理索引创建的规则
a、小表一般不建索引,大表考虑创建索引。
b、给经常出现在where、order by、distinct、
group by子句中的列创建索引。
c、给经常作为联合条件的字段,创建索引。
d、不要在经常做DML操作的表中创建索引。
e、索引不是越多越好,适当就好。
f、一定要删除不合适的索引。

4)、维护索引
对经常做DML操作的表,若创建索引,一定要定期维护。
alter index 索引名 rebuild;

如:alter index emp_job_index rebuild;

5)、删除索引
对不合适的索引,要进行删除。
drop index 索引名;

如:drop index emp_job_index;

5、存储过程

6、触发器

你可能感兴趣的:(数据库操作(十))