oracle--約束(主鍵、非空、檢查)

  • 2019 年 10 月 10 日
  • 筆記

問題1:學號重複了,數據還可以插入成功  						使用主鍵約束:學號是唯一標識一條數據的,所以必須唯一且不能為空  							   ---(1)、在確定為主鍵的欄位後添加 primary key關鍵字  							   ---(2)、在創建表的後面使用:constraints pk_表名_欄位名 primary key(欄位名)  							   --(3)、在創建表後使用 alter table 表名 add constraints pk_表名_欄位名 primary key(欄位名);  							   --刪除主鍵:alter table 表名 drop constraints pk_表名_欄位名  					問題2:姓名可以為空。  						使用非空約束  							   ---(1)、創建表的時候在欄位後面添加not null  							   ---(2)、在創建表欄位後使用 constraints ck_表名_欄位名 check(欄位名 is not null)  了解  							   --(3)、在創建表後使用alter table 表名 modify 欄位名 類型 not null;  							   ---(4)、修改欄位可以存儲空值:alter table 表名 modify 欄位名 類型 null;  					問題3:性別不但可以為空,還可以為其他不知道的字元  						使用檢查約束  							  ---(1)、創建表的時候在欄位後使用 default 值 check(條件),  							  ---------但是會允許空值的出現,並且默認值只有在欄位不聲明的情況下生效  							  ---(2)、在創建表所有欄位後使用:constraints ck_表名_欄位名  check(條件)  							  ---(3)、在創建表後使用:alter table 表名 add constraints ck_表名_欄位名 check(條件)  					問題4:年齡可以超過200  							 --使用檢查約束條件  					問題5:qq號一致  							使用唯一約束  							 --(1)、在欄位後直接使用unique關鍵字  							 --(2)、在所有欄位後使用:constraints uk_表名_欄位名 unique(欄位名)  							 --(3)、 alter table 表名 add constraints uk_表名_欄位名 unique(欄位名)  							 --刪除唯一約束:alter table 表名 drop constraints uk_表名_欄位名

使用外鍵約束 --(1)、在欄位後使用 references 參照表表名(參照欄位) --(2)、在所有欄位後使用 constraints fk_表名_欄位名 foreign key(欄位名) references 參照表名(參照欄位名) --(3)、在創建表後使用alter table 表名 add constraints fk_表名_欄位名 foreign key(欄位名) references 參照表名(參照欄位名) --刪除外鍵 alter table 表名 drop constraints fk_表名_欄位名

在刪除父表數據的時候需要先刪除子表數據? 解決方式1:先解除主外鍵關聯,然後刪除數據,再然後添加主外鍵關聯 解決方式2:在創建外鍵的時候使用級聯操作。 --在創建外鍵時 on delete cascade --在創建外鍵時 on delete set null 怎麼選取外鍵? 一般將主表的主鍵作為子表的外鍵 外鍵的值能為 not null? 不建議在外鍵後使用非空約束

1、主鍵約束

三種方式主鍵約束方式

create table student(         sno number(10) primary key,         sname varchar2(100),         sage number(3),         ssex char(4),         sbirth date,         sqq varchar2(30)  );
create table student(         sno number(10),         sname varchar2(100),         sage number(3),         ssex char(4),         sbirth date,         sqq varchar2(30),         constraint pk_student_sno primary key(sno) ---添加主鍵約束  );
create table student(         sno number(10),         sname varchar2(100),         sage number(3),         ssex char(4),         sbirth date,         sqq varchar2(30)  );  alter table student add constraint pk_student_sno primary key(sno);  alter table student drop constraint pk_student_sno;
select * from student for update;  drop table student;

非空約束

三種方式

create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3),         ssex char(4),         sbirth date,         sqq varchar2(30)  );
create table student(         sno number(10) primary key,         sname varchar2(100),         sage number(3),         ssex char(4),         sbirth date,         sqq varchar2(30),         constraints ck_student_sname check(sname is not null)  );
create table student(         sno number(10) primary key,         sname varchar2(100),         sage number(3),         ssex char(4),         sbirth date,         sqq varchar2(30)    );

  alter table student add constraint ch_student_sname check(sname is not null);  

alter table student drop constraint ch_student_sname 

檢查約束

create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3) check(sage<150 and sage>0),         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30)  );
create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3),         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30),         constraint ch_student_sage check(sage<150 and sage>0)  );
create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3),         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30)  );

alter table student add constraint ch_student_sage check(sage<150 and sage>0);

alter table student drop constraint ch_student_sage;

 唯一約束

create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3) check(sage>1 and sage < 200) ,         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30)  unique  );

  插入倆次報錯

insert into student values(6,'關曉彤003',18,'女',to_date('1998-05-26','yyyy-mm-dd'),'989');
create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3) check(sage>1 and sage < 200) ,         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30),         constraint ch_student_sqq unique(sqq)  );
第三種
create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3) check(sage>1 and sage < 200) ,         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30)  );
alter table student add constraint un_student_sqq unique(sqq);

外鍵約束

選取--一般選取 父表的主鍵做為字表的外鍵

缺點--無法刪除班級3的資訊

create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3) check(sage>1 and sage < 200) ,         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30) unique,         cno number(10) references clazz(cno)  --可以起不同的名,是映射關係  );    create table clazz (    cno number(10) primary key,    cname varchar(100) not null,    cdesc varchar(200)  );      insert into student values(11,'關曉彤003',18,'女',to_date('1998-05-26','yyyy-mm-dd'),'11',1);  insert into student values(12,'關曉彤003',18,'女',to_date('1998-05-26','yyyy-mm-dd'),'22',1);  insert into student values(13,'關曉彤003',18,'女',to_date('1998-05-26','yyyy-mm-dd'),'333',2);  insert into student values(14,'關曉彤003',18,'女',to_date('1998-05-26','yyyy-mm-dd'),'444',2);    insert into clazz values(1,'java','java');  insert into clazz values(2,'pathon','pathon');    select * from student s inner join clazz c on s.cno = c.cno;  insert into student values(15,'關曉彤003',18,'女',to_date('1998-05-26','yyyy-mm-dd'),'55',3); 
create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3) check(sage>1 and sage < 200) ,         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30) unique,         cno number(10),--可以起不同的名,是映射關係         constraint fk_student_cno foreign key(cno) references clazz(cno)  );
create table student(         sno number(10) primary key,         sname varchar2(100) not null,         sage number(3) check(sage>1 and sage < 200) ,         ssex char(4) check(ssex ='男' or ssex = '女'),         sbirth date,         sqq varchar2(30) unique,         cno number(10)--可以起不同的名,是映射關係  );

alter table student add constraint fk_student_cno foreign key(cno) references clazz(cno); alter table student drop constraint fk_student_cno;

on delete cascade 刪除父表時候,字表一起刪除
delete set null 刪除父表時候,字表設置為null
alter table student add constraint fk_student_cno foreign key(cno) references clazz(cno) on delete cascade;  alter table student add constraint fk_student_cno foreign key(cno) references clazz(cno) on delete set null;

Tags: