Oracle中五种约束类型:唯一性约束、主键约束、外键约束、非空约束、check约束

创建student表

create table student (
/*
约束设置格式:constraint 约束名称 约束类型(字段名).其中约束名称可以随便起,不起的话系统会
赋予一个名字(比如去掉constraint PK_student),PK开头是表示primary key缩写,表示主键约束。
*/
    student_number  number(10) constraint PK_student primary key, 
    student_name    varchar2(10) NOT NULL,
    student_identity_card  varchar2(20) constraint UN_student_identity_card unique,
    student_gender  varchar2(4),
    student_class   varchar2(10)
//也可以把约束放在这里  constraint PK_student primary key(student_number)
)

        唯一性约束在我看来是用来标识一项数据的,这里的一项数据指的是某个表的某一个字段对应的数据。比如在上面的建表语句中,我给字段student_identity_card设置了唯一性约束,是因为学生身份证号是不可能存在相同的情况的,所以这个存放学生身份证号的字段不能存在俩个相同的值,唯一性约束就可以有效的预防这种情况。

        举个例子,我现在有另外一份数据,数据中存在学生身份证号的情况,那么我将这张表的数据插入刚刚我新建的student表的时候,就会有报错,说你的student_identity_card存在违反唯一性约束的情况,这个时候你就可以根据错误回去找到错误的数据修改掉,所以我说我说可以预防这种错误的情况。

        另外唯一性约束运行字段的值为空,允许存入null,一个表上可以设置多个唯一性约束。

        主键约束(primary key)在我看来是用来标识一组(一行)数据的,这里的一组数据指的是一个表中的一行数据。主键约束 = 唯一性约束 + 非空约束,也就是说设置了主键约束的字段的数据唯一且不为空。

        同样再举个例子,上面建的student表,student_number和student_identity_card都可以用来唯一标识student表的一组数据,也就是说这俩个字段谁做主键都可以,当然逻辑上我们肯定更愿意用学号来标识学生信息表。其实吧,唯一性约束的这种字段就是可以拿来当主键的,但是要考虑到主键不允许为空的情况。

        我向student表中加入student_subject字段来表示学生科目(假如每个人都学习语数英三科),那么你根据学号或者身份证号来查学生信息就能查出来每个学生有三组信息,那么这俩个字段就不能唯一的标识一组数据,也就不能用来当主键。那么我把学号+科目或者身份证号+科目看成一个集体,那么就能唯一来标识一组数据

        当然,主键含有多个字段的时候你不能说有多个主键,应该是这些字段共同构成了一个主键。

        外键约束是用于表达两个表数据之间的关系将表(主表)中主键字段添加到另一个表(从表)中,再创建两个表之间的约束关系,这些字段就成为第二个表的外键。

        设置了外键约束了以后有以下效果(注意:下面修改数据都是默认修改的俩表关联的,外键约束的字段!!!!!!!):

 (1)对从表数据进行修改:

        a.对从表插入或修改数据时,如果使得外键值存在 不在主表主键值范围内的情况,会发生报错。也就是说从表里面的数据必须也在主表里面

(2)对主表数据进行修改:

        a.对主表删除或修改数据时,如果修改或删除的数据在从表里面也存在,则会报错。除非我们创建外键的时候定义好:

        删除主表数据时,同步删除从表相应数据(on delete cascade);

        删除主表数据时,同步设置从表相应数据为null(on delete set null)。

create table student_score {
    student_number varchar2(10),
    student_name   varchar(10),
    subject        varchar2(20),
    score          varchar2(4),
    foreign key(student_number) references student(student_number)
/*
后面可以跟:
    1、on delete cascade(主表删除数据,从表同步删除对应数据)
    2、on delete set null(主表删除数据,从表同步设置相应数据值为null)
    3、on update cascade(主表修改数据,从表同步修改对应对应数据)
    4、on update set null(主表修改数据,从表同步设置相应数据值为null)
*/
};

on update 和 on delete  后面可以跟的词语有四个
no action  , set null ,  set default  ,cascade
no action 表示 不做任何操作,
set null    表示在外键表中将相应字段设置为null
set default 表示设置为默认值

-----------------------------------------------------------
对于已经创建好的表也可以这样增加外键约束:
alter table student_score 
    add constraint 约束名称 foreign key(student_number) references student(student_number)
    on delete或者update ....
-----------------------------------------------------------
除了外键,其他约束的删除、禁用、启用都可以
删除外键:
alter table student_score drop constraint 约束名称

禁用外键:
alter table student_score disable constraint 约束名称

启用外键:
alter table student_score enable constraint 约束名称

        另外Oracle中所有约束的相关信息都在user_constraints表里面,constraint_type='R'的就是外键,可以通过此表找到约束名。

        也可以参考这几篇文章,这几个博客写的挺好的:

Oracle的主键和外键 - 码农有道 - 博客园

oracle外键--详解_Luxury奢华家的博客-CSDN博客_oracle 外键

        非空约束,字面意思,限定字段的值不为空,参考上面student表的student_name字段。

        CHECK约束指的是在表的列中增加额外的限制条件。使用CHECK约束需要注意一下3点:

        1、CHECK约束不能早view中定义;

        2、CHECK约束只能定义的列必须包含在所指定的表中;

        3、CHECK约束不能包含子查询。

下面写几个CHECK约束的例子:

create table student_socore{
    student_number varchar2(10) constraint 约束名称 CHECK(length(student_number) = 8,
    student_name   varchar(10),
    subject        varchar2(20) constraints 约束名称 CHECK(subject in ('语文','数学','外语')),

//这里注意字段类型,varchar2是不能直接比大小的,number型可以
    score          number(4) constraints 约束名称 CHECK(number >= 0 and number <= 150)
};

猜你喜欢

转载自blog.csdn.net/qq_54381110/article/details/125349025