oracle_5(约束、三大范式、数据库设计软件) 课堂笔记

约束:

对数据的限制条件

常见约束:

检查约束: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 自动生成代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值