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;