约束:
对数据的限制条件
常见约束:
检查约束:check name > 4
唯一约束:Unique id: 1,2,3,4
主键约束:Primary key 类似唯一约束,非空+唯一
外键约束:Foreign key 两张表
非空约束:Not null 不能为null
默认约束: Defalult adress:
主键和唯一的区别:
1.主键不能为空,不能为null
2.主键可以是复合主键,也可以是单值主键(ID)
3.一张表中,只能设置一次主键(复合主键),但唯一键可以设置多次
分类:
列级约束 表级约束
作用于一个列 作用与一个列/多列
列的后面 表的后面
可以有多个约束 空格分隔 逗号分隔
全部的六个 4个(主键 外键 唯一 检查)
列级约束:
创建表
create table student(
stuno number(3) primary key,
stuname varchar2(10) not null unique,
stuaddress varchar2(20) default '河南洛阳' check(length(stuaddress)>2),
stuid number(3)
);
加约束名: 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),
stuid number(3)
);
约束名是多个表共用的。(多个表中的约束不能重名)
插入数据
insert into student values(1,'zz','hello北京',1);
insert into student values(2,'zs',default,1);
注意事项:
报错: 违反唯一约定 可能是主键报错,也可能是唯一报错
如果有多个约束, default必须放在第一位
check约束: 如何编写?? 和使用where完全相同
唯一约束 可以是null 但不适用于null
表级约束:
创建表
create table student2(
stuno number(3) ,
stuname varchar2(10) ,
stuaddress varchar2(20) ,
stuid number(3),
constraint PK_sno primary key(stuno),
constraint UQ_sname_subid unique(stuname,stuid),
constraint CK_saddress check(length(stuaddress)>2)
);
外键约束
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
subid number(3)
);
insert into student3 values(1,'zz',1);
insert into student3 values(2,'ls',1);
insert into student3 values(3,'ww',2);
create table sub(
sid number(3) unique,
sname varchar2(10)
);
insert into sub values(1,'java');
insert into sub values(2,'python');
外键描述: A表中的a列指向B表中的b列;a称为外键
创建表的同时 增加外键
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
subid number(3),
constraint FK_student3_sub foreign key(subid) references sub(sid)
);
直接创建外键时会报错: 此列列表的唯一关键字或主键不匹配 外键所指向的字段
必须是主键,或者唯一约束的键
定义外键需要四个参数: 两张表名,两个字段名 (默认存在当前表)
插入数据
insert into student3 values(1,'zz',1);
insert into student3 values(2,'ls',1);
insert into student3 values(3,'ww',2);
外键含义: A.a ->B.b a中的数据必须来自于b中
如果删除父表中 外键所指向的字段,两个方法
级联删除
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
subid number(3),
constraint FK_student3_sub foreign key(subid) references sub(sid) on delete cascade
);
insert into student3 values(1,'zz',1);
insert into student3 values(2,'ls',1);
insert into student3 values(3,'ww',2);
delete from sub where sid = 2;
删除父表中的数据时(外键) ,子表会删除相应的数据
级联置空
create table student3(
stuno number(3) ,
stuname varchar2(10) ,
subid number(3),
constraint FK_student3_sub foreign key(subid) references sub(sid) on delete set null
);
insert into student3 values(1,'zz',1);
insert into student3 values(2,'ls',1);
insert into student3 values(3,'ww',2);
delete from sub where sid = 2;
删除父表中的数据时(外键) ,子表会将对应的那个字段置为null,其他字段不影响
外键使用建议:
1.添加子表数据时,要先看外键在父表中有没有对应的数据
2.不要更改父表的数据,会导致子表孤立。
3.建议:在创建外键时,直接设置成级联删除,或者级联置空。
4.删除表时,先删子表,再删父表。
追加约束 创建时忘了加约束,后续可以追加
1.(唯一(UQ_字段),主键(PK_),检查(CK_),外键(FK_))
alter table 表名 add constraint 约束名 约束类型
示例:
create table student4(
stuno number(3) ,
stuname varchar2(10) ,
subid number(3)
);
alter table student4 add constraint UQ_stuno4 unique(stuno);
2.(默认(不起名字,不要constraint)、非空(NN_字段))
alter table 表名 modify 字段名 constraint 约束名 约束类型
示例:
create table student5(
stuno number(3) ,
stuname varchar2(10) ,
subid number(3)
);
非空: alter table student5 modify stuname constraint NN_stuname5 not null;
默认: alter table student5 modify stuname default '没有名字'
删除约束:
唯一、主键、检查、外键、非空
格式: alter table 表名 drop constraint 约束名;
alter table student4 drop constraint UQ_stuno4;
特殊情况: 默认约束 没有约束名字
alter table 表名 drop constraint null;
完整性约束:
保证数据的正确性、相容性、防止数据冗余
域完整性: 列 数据类型、非空、检查、外键
实体完整性: 行 主键、唯一、
引用完整性: 不同表之间 外键
自定义完整性: 触发器(当执行一个操作时,会触发另一个操作)
三大范式NF
1NF.确保每列的原子性(不可再分)
student
id name address
1 zs 河南省洛阳市汝阳县
拆
id name province city zone
1 zs 河南省 洛阳市 汝阳县
2NF :
宏观:每张表只描述一件事情(例如 一个student表 描述的全部都是学生字段)
微观: 通过2NF定义:除了主键以外的其他字段,都依赖于主键
3NF:
微观: 除了主键以外的其他字段,都不传递依赖于主键
注意: 要满足N范式,必须先满足N-1范式
三大范式 可以帮助我们规范数据库的设计
好处:防止数据混乱,数据冗余
缺点:很难严格排查出所有 不满足的表 并且 难以拆分 会一定程度影响性能。
建议: 三大范式 只是一个建议,不必严格遵守
实际使用时,需要在 “规范性”、“易用性”、“性能” 间综合考虑
数据库设计软件:
Power Designer
创建表时有两个字段
General: 表名
name: 给用户看的,只用于显示
code: 代码实际操作
在PowerDesigner中设计完以后,ctrl+g 自动生成代码