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


問題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;

  

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM