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