加约束名: constraint 约束名
create table student(
stuno number(3) constraint PK_stuno primary key ,
stuname varchar2(10) constraint NN_stuname not null constraint UQ_stuname unique ,
stuaddress varchar2(20) default ‘陕西西安’ constraint CK_stuaddress check(length(stuaddress)>2),
stubid number(3)
);
insert into student values(1, ‘zzz’,default,1) ;
注意事项:
约束名是 多个表公用的 (多个表中的约束 不能重名)
create table student2(
id number(3) constraint PK_stuno primary key ,
name varchar2(10)
);
表级约束
create table student2(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
stubid number(3),
constraint PK_sno primary key(stuno) ,
constraint UQ_sname_subid unique(stuname,stubid),
constraint CK_saddress check( length(stuAddress)>2)
);
外键
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
subid number(3)
);
insert into student3(stuno,stuname,subid) values(1,‘zs’,1);
insert into student3(stuno,stuname,subid) values(2,‘ls’,1);
insert into student3(stuno,stuname,subid) values(3,‘ww’,2);
create table sub
(
sid number(3),
sname varchar2(10)
);
insert into sub values(1,‘java’);
insert into sub values(2,‘python’);
尝试插入非法数据:
insert into student3(stuno,stuname,subid) values(4,‘zl’,3);
给表加外键:
创建表的同时 增加外键
drop table student3 ;
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
subid number(3) ,
constraint FK_student3_sub foreign key(subid) references sub(sid)
);
其中,解释: constraint FK_student3_sub foreign key(subid) references sub(sid) ;
直接创建外建时报错:此列列表的【唯一关键字或主键】不匹配 ,含义是:外键所指向的 字段 必须先是 主键 或者唯一约束的键。
定义外键 需要4个参数: 两个表名 ,两个字段名
insert into student3(stuno,stuname,subid) values(1,‘zs’,1);
insert into student3(stuno,stuname,subid) values(2,‘ls’,1);
insert into student3(stuno,stuname,subid) values(3,‘ww’,2);
drop table sub;
create table sub
(
sid number(3) unique,
sname varchar2(10)
);
insert into sub values(1,‘java’);
insert into sub values(2,‘python’);
insert into student3(stuno,stuname,subid) values(1,‘zs’,1);
insert into student3(stuno,stuname,subid) values(2,‘ls’,1);
insert into student3(stuno,stuname,subid) values(3,‘ww’,2);
insert into student3(stuno,stuname,subid) values(4,‘zl’,3);
外键含义: A.a ->B.b字段, a中的数据 必须来自于b中。
如果删除父表中 外键所指向的列, 2个策略:级联删除|级联置空
drop table student3;
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
subid number(3) ,
constraint FK_student3_sub foreign key(subid) references sub(sid) on delete cascade【或set null 】
);
insert into student3(stuno,stuname,subid) values(1,‘zs’,1);
insert into student3(stuno,stuname,subid) values(2,‘ls’,1);
insert into student3(stuno,stuname,subid) values(3,‘ww’,2);
级联删除
drop table student3;
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
subid number(3) ,
constraint FK_student3_sub foreign key(subid) references sub(sid) on delete cascade
);
–
级联置空
drop table student3;
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
subid number(3) ,
constraint FK_student3_sub foreign key(subid) references sub(sid) on delete set null
);
insert into student3(stuno,stuname,subid) values(1,‘zs’,1);
insert into student3(stuno,stuname,subid) values(2,‘ls’,1);
级联删除:当删除父表中的数据时,子表 会跟着删除相对应的数据;
级联置空:当删除父表中的数据时,子表 会将 相对应的 那一字段的值设置为Null,其他字段不影响;
外键使用建议:
1.当父表中没有相对应数据时,不要向子表增加数据(如果sub表没有编号为2的课程,那么子表student不要去选择2号课程)
2.不要更改父表的数据,导致子表孤立
3.建议:在创建外键时 直接设置成 级联删除 或级联置空
4.删除表? 先删除子表,再删除父表
追加约束:在创建表示忘了加约束,后续可以追加约束
1.唯一、主键、检查、外键约束
alter table 表名 add constraint 约束名 约束类型I
create table student4(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
subid number(3)
);
alter table student4 add constraint UQ_stuaddress4 unique(stuaddress);
alter table student4 add constraint PK_stuno4 primary key (stuno );
alter table student4 add constraint CK_stuname4 check(length(stuname)>2);
alter table student4 add constraint FK_student4_sub foreign key(subid) references sub(sid);
不适用于 默认、非空
alter table student4 add constraint NN_stuname not null(stuname);
alter table student4 add constraint DF_stuname default ‘hello’ ;
alter table 表名 motidy 字段名 constraint 约束名 约束类型
非空
alter table student4 modify stuname constraint NN_stuname4 not null ;
默认(建议默认约束不起名字,不写constraint)
alter table student4 modify stuname default ‘没名字’ ;
删除约束:
alter table 表名 drop constraint 约束名;
alter table student4 drop constraint UQ_stuaddress4;
alter table student4 drop constraint PK_stuno4;
alter table student4 drop constraint CK_stuname4;
alter table student4 drop constraint FK_student4_sub;
alter table student4 drop constraint NN_stuname4;
特殊情况:
默认约束(删除默认约束: 将默认约束置为null)
alter table student4 modify stuname default null ;
完整性约束:保证数据的正确性、相容性、防止数据冗余等。
域完整性: 列。数据类型,非空约束,检查约束,外键约束
实体完整性:行。主键约束、唯一约束
引用完整性:不同表之间。外键
自定义完整性:触发器(当执行换一个操作时,会自动触发另一个操作)。例如:自定义需求 学生的上学时间 必须在出生日期之后。