您的位置:首页 > 数据库 > Oracle

Oracle 11g 学习七:表的约束、集合和序列

2014-08-10 10:19 405 查看
一、表的约束

    表的约束就是对输入表的内容的合法性进行审查;约束的主要功能就是保证数据表内容的合法性,安装约束分类,一共有五种约束:非空约束、唯一约束、主键约束、检查越是、外键约束。

1、非空约束:NOT NULL (NK)

    当数据表中的某个字段上的内容不希望设置为NULL时,则可以使用NOT NULL 进行指定

    例:定义一张member表 

   
CREATE TABLE member(

       
mid         NUMBER

       
name        VARCHAR2(20) NOT NULL ,

       
age         NUMBER(3) ,

   
);

    正确:

        INSERT INTO member(mid,name,age) VALUES(1,'张三',12);

        INSERT INTO member(mid,name,age) VALUES(2,'李四',22);

    错误:
        INSERT INTO member(mid,name) VALUES(8,null);

 
      INSERT INTO member(mid) VALUES(10);

2、唯一约束:UNIQUE(UK)
 
  唯一约束指的是每一列上的数据是不允许重复的,但是允许为空null也允许null重复  
 
  为了出现违反唯一约束时错误提示出违反字段使用如下格式:CONSTRAINT 约束类型_字段  约束(字段); 
 
  例:定义一张member表 
        DROP TABLE member PURGE ;

    
CREATE TABLE member(

        
mid         NUMBER 

        
name        VARCHAR2(20) NOT NULL ,

        
email       VARCHAR2(30) ,

                CONSTRAINT  uk_email UNIQUE(email) 

    
);

    正确:

        INSERT INTO member(mid,name,email) VALUES(1,'张三','javaweb@163.com');

        INSERT INTO member(mid,name,email) VALUES(2,'李四','java@126.com');

    错误:

        INSERT INTO member(mid,name,email) VALUES(8,'王五','java@126.com');

3、主键约束:PRIMARY KEY (PK)

    主键约束是非空约束和唯一约束的综合,主键约束不能为空也不能重复,如人员ID;

     例:定义一张member表 

        DROP TABLE member PURGE ;

    
CREATE TABLE member(
        
mid         NUMBER 
        
name        VARCHAR2(20) NOT NULL ,
        
email       VARCHAR2(30) ,
                CONSTRAINT  pk_mid PRIMARY KEY(mid) ,
    
);
    正确:
        INSERT INTO member(mid,name,email) VALUES(1,'张三','javaweb@163.com');
        INSERT INTO member(mid,name,email) VALUES(2,'李四','java@126.com');

    错误:

        INSERT INTO member(mid,name,email) VALUES(1,'王五','java123@126.com');

4、检查约束:CKECK (CK)

    检查约束指的是为了表中的一些数据增加一些过滤条件,如设置年龄的范围等    

    例:定义一张member表 

        DROP TABLE member PURGE ;

    
CREATE TABLE member(
        
mid         NUMBER 
        
name        VARCHAR2(20) NOT NULL ,
        
age         NUMBER(3)  ,
                sex         VARCHAR2(10),

                CONSTRAINT  pk_mid PRIMARY KEY(mid) ,
                CONSTRAINT  ck_age CHECK(age BETWEEN 0 AND 150),
                CONSTRAINT  ck_sex CHECK(sex IN ('男','女'))
    
);
    正确:
        INSERT INTO member(mid,name,age,sex) VALUES(1,'张三',25,'男');
        INSERT INTO member(mid,name,age,sex) VALUES(2,'李红',26,'女');

    错误:
        INSERT INTO member(mid,name,age,sex) VALUES(3,'王五','人妖',21);
        INSERT INTO member(mid,name,age,sex)
VALUES(4,'赵四','男',221);

5、外键约束 FOREIGN KEY(fk)
    主-外键约束是在两张表之间的约束,此时两张表存在父子关系,即子表的某个字段取值范围由父表决定
    例:要求表示出一种关系每个人有多本书,每本书都有一个主人,需要两张表:person和book,book应为person的子表
    DROP TABLE book PURGE ;
    DROP TABLE person PURGE ; 

    CREATE TABLE person(

        
mid         NUMBER 

        
name        VARCHAR2(20) NOT NULL ,

        
age         NUMBER(3)  ,

                CONSTRAINT  pk_mid PRIMARY KEY(mid) ,

                CONSTRAINT  ck_age CHECK(age BETWEEN 0 AND 150),

    
);

    CREATE TABLE book(

        
bid         NUMBER 

        
title       VARCHAR2(20) NOT NULL ,

        
mid         NUMBER ,

                CONSTRAINT  pk_bid PRIMARY KEY(bid) ,

                CONSTRAINT  fk_mid FOREIGN KEY(mid) REFERENCES member(mid),

    
);

   正确:
       INSERT INTO person(mid,name) VALUES(1,'张三');
       INSERT INTO person(mid,name) VALUES(2,'赵四');

 
     INSERT INTO person(mid,name) VALUES(3,'王五');

 
     INSERT INTO book(bid,title,mid) VALUES(101,'Java学习文档',1) ;
 
     INSERT INTO book(bid,title,mid) VALUES(102,'Java Web学习手册',2) ;

 
     INSERT INTO book(bid,title,mid) VALUES(103,'C语言学习手册',3) ;

 
     INSERT INTO book(bid,title,mid) VALUES(104,'Java开发手册',1) ;

 
     INSERT INTO book(bid,title,mid) VALUES(105,'Android开发手册',2) ;

 
     INSERT INTO book(bid,title,mid) VALUES(106,'AJAX学习开发',3) ;

 
  错误:
 
     INSERT INTO book(bid,title,mid) VALUES(108,'算法与数据结构',4) ;

 
     INSERT INTO book(bid,title,mid) VALUES(109,'计算机组成原理',5) ;

    注意:A. 存在外键约束的父子表中若删除父表的数据时必须先删除子表相关数据再删父表数据
             例:DELETE FROM book WHERE mid=1 ;
                 DELETE FROM person WHERE mid = 1 ;
             也可以在创建外键约束时添加级联删除字段:ON DELETE CASCADE 如修改book外键约束为:
                CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE
             此时 DELETE FROM member WHERE mid=1 ;   将自动删除book中mid=1的数据。
         B. 在删除父表时不希望子表数据直接删除,而是外键约束字段设置为null即将子表关联字段设置为NULL
            修改外键约束加字段:ON DELETE SET NULL 
               CONSTRAINT fk_mid FROEIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL 
            例:DROP FROM person WHERE mid=1 ;此时删除父表mid=1的数据同时子表book中mid=1的数据依然存在                只是关联字段mid被设置成了null
         C. 由于存在主-外键约束,不能直接删除父表,此时必须先删除子表再删除父表
            例:DROP TABLE book PURGE ;
                DROP TABLE person PURGE ;
            Oralce提供了一种强制删除父表忽略子表的操作,加入字段CASCADE CONSTRAINT
            例: DROP TABLE person CASCADE CONSTRAINT PURGE;
            最佳做法是:先删除子表再删除父表
               DROP TABLE book CASCADE CONSTRAINT PURGE;
 
             DROP TABLE book CASCADE CONSTRAINT PURGE;

6、修改表的约束
    约束本身也属于数据库对象,约束的修改也使用ALTER命令,约束的修改主要存在以下两种操作:约束增加和删除。
   

增加约束:ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(字段)
    删除约束:ALTER TABLE 表名称 MODIFY CONSTRAINT 约束名称
    注意如果在表中已经存在一些不符合要修改的约束条件的内容,则新增约束无法添加,但是约束修改在数据库使用过程中最好也不要修改,在建表时一起建好。
7、查询约束
    在Oracle中,约束也存在于数字字典之中
    查询user_constraint数据字典
        SELECT owner,constraint_name,table_name FROM user_constraint ;
    查询user_cons_columns数据字典
        COL owner FOR A15; 
        COL constraint_name FOR A15; 

 
      COL table_name FOR A15; 

 
      COL column_name FOR A15; 
 
     SELECT owner,constraint_name,table_name,column_name FROM user_cons_columns ;
二、集合操作
 
  数学中存在交、差、并、补的概念,在Oracle数据查询中有如下连接符号:UNION,UNION ALL,INTERSECT,MINUS。
 
       CERATE TABLE emp20 AS SEELCT * FROM emp WHERE deptno=20 ; 
 
  UNION:(无重并集)自动去掉结果集中的重复行,并以第一列的结果升序排序
 
       SELECT * FROM emp20 UNION SELECT * FROM emp ;
 
  UNION ALL:(有重并集):不去掉重复行,不排序
 
       SELECT * FROM emp20 UNION ALL SELECT * FROM emp ;         
 
  INTERSECT:(交集)两个结果集的交集,第一列升序
         SELECT * FROM emp20 INTERSECT SELECT * FROM emp ;

    MINUS:(差集)只显示在一个集合中存在,而在第二个集合中不存在的数据,且第一列升序
         SELECT * FROM emp MINUS SELECT * FROM emp20
;

三、序列
    Oracle序列的创建语法:
       CREATE SEQUENCE 序列名称 [INCREMENT BY n][START WHITH n][{MAXVALUE n|NOMAXVALUE}]
              [{MINVALUE n|NOMINVALUE}][{CYCLE|NOCYCLE}][{CACHE|NOCACHE}] ;
    创建序列:
        CREATE SEQUENCE myseq ;
    当一个序列创建完成之后,可以通过以下两种方式访问序列:
        序列名称.nextval: 让序列增长到下一个内容
        序列名称.currval: 取得当前序列的内容

    在Oracle中想要currval操作必须先使用nextval操作;
       例:SELECT myseq.nextval FROM dual ;
           SELECT myseq.currval FROM dual ;
    序列一般都作为主键使用,如定义下表
        DROP TABLE mytab PURGE ;
        CREATE TABLE mytab(id NUMBER PRIMARY KEY,name VARCHAR2(20) NOT NULL) ;
    向表mytab中增加数据:
        INSERT INTO mytab(id,name) VALUES(myseq.nextval,'姓名');
    默认情况下,序列从0开始,每次增长1,也可以从10开始每次增长2
        DROP sequence myseq ;
        CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 10 ;
        SELECT myseq.nextval FROM dual ;
    范例:定义一个序列,这个序列可以在1、3、5、7、9之间循环出现;
        DROP SEQUENCE myseq;
        CREATE SEQUNECE myseq INCREMENT BY 2 START WITH 1 MAXVALUE 10 MINVALUE 1 CYCLE NOCACHE ;
    

 *************by jixiangrurui  转载请注明出处*************    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: