oracle---约束(primary key,unique,not null,check,foreign key)

约束分为以下5种:
  主键 ---唯一(表中只有一个主键),非空,不重复
  唯一约束
  检查约束: 检查一个列的内容是否合法
   |---例如:年龄:0~150岁
   非空约束
   外键约束: 在两张表中进行约束的操作
   
create table person(
   pid varchar2(10) primary key  
)   

Oracle错误信息:
ORA-0001:违反唯一性约束条件(SCOTT.SYS_C005270)
错误信息上给出的是一个编号的形式,实际上此编号就是表示约束的名称,是系统分配的名称

如果我们想自己去定义这个名称呢?
使用constraint
create table person(
   pid varchar2(10),
   constraint person_pid_pk primary key(pid)
)   
Oracle错误信息:
ORA-0001:违反唯一性约束条件(SCOTT.person_pid_pk)

create table person(
   pid varchar2(10),
   name varchar2(20) not null, //因为非空约束在数据库的错误信息会明确指出来,所以也就没必要用constraint重命名了
   constraint person_pid_pk primary key(pid)
)     

唯一约束也是可以重命名
create table person(
   pid varchar2(10),
   name varchar2(20) unique not null,
   constraint person_pid_pk primary key(pid)
)  

create table person(
   pid varchar2(10),
   name varchar2(20) not null,
   constraint person_pid_pk primary key(pid),
   constraint person_name_uk unique(name)
)  

检查约束: check
create table person(
   pid varchar2(10),
   name varchar2(20) not null,
   age number(3) not null check(age between 0 and 150),
   sex varchar2(2) default '男' check(sex in ('男','女','中')),
   constraint person_pid_pk primary key(pid),
   constraint person_name_uk unique(name)
)

因为错误信息也是自动的一个名字,所以我们可以重命名  

create table person(
   pid varchar2(10),
   name varchar2(20) not null,
   age number(3) not null ,
   sex varchar2(2) default '男' ,
   constraint person_pid_pk primary key(pid),
   constraint person_name_uk unique(name),
   constraint person_age_ck check(age between 1 and 150),
   constraint person_sex_ck check(sex in ('男','女','中'))
   
)


主外键约束(foreign key)---正对两张表的约束
如果在一张表中有外键,那么插入这张表的数据时,这个外键必须存在,如果外键没有
则不能插入,会报错说:找不到父项关键字
create table book(
     bid number primary key,
     bname varchar2(5) not null,
     pid varchar(18),
     constraint person_book_pid_fk foreign key(pid) references person(pid) //想成挂载到person表的pid上,作为一个叶子节点
)

删除时候,先删除子表再删除父表。。。
如果我想不管外键直接删除怎么办。。。
添加的时候如果没有父亲,当然无法挂载啦

drop table person cascade constraints; //级联的翻译不好,翻译成忽略约束吧

如果希望一个表中的数据在删除时,可以自动删除掉其对应子表记录,则就可以使用级联删除操作,需要在定义表时候做出来
create table book(
     bid number primary key,
     bname varchar2(5) not null,
     pid varchar(18),
    constraint person_book_pid_fk foreign key(pid) references person(pid) on delete cascade//当删除父亲的时候,对应的孩子也会被删除
)

修改约束:(了解)
此时,需要为表中添加若干个约束,添加约束的语法如下:
alter table 表名称 add constraint 约束名称 约束类型(约束字段)
删除约束:
alter table book drop constraint book_pid_fk;

你可能感兴趣的:(oracle)