维护数据的完整性
数据的完整性:用于确保数据库遵从一定的商业逻辑规则,在oracle中,数据完整性可以使用约束、触发器,应用程序(过程,函数)三种方法来实现。在这三种方法中,因为约束易于维护,并且有良好的性能,所以作为维护数据完整性的首选。
商业逻辑规则:
性别:男 女
年龄:0-150
约束 not null 非空
用于指定某列的值,不能为空。
create table nulltest(id number not null,uname varchar2(20));
insert into nulltest(uname) values ('张三');--报错
约束 primary key 主键
用于唯一的标示表行的数据,当定义主键约束后,该列不能重复且不能为null;
create table primarytest(id number primary key,uname varchar2(20));
insert into primarytest(uname) values ('张三');--报错
insert into primarytest values (1,'张三');
insert into primarytest values (1,'李四');--报错
约束 unique 唯一
用于指定某列的值,不能重复,但是可以为null。
create table uniquetest(id number unique,uname varchar2(20));
insert into uniquetest(uname) values ('张三');
insert into uniquetest values (1,'张三');
insert into uniquetest values (1,'李四');--报错
约束 foreign key 外键
外键指向主键列或者指向unique列。
外键列和主键列数据类型要一致。(长度可以不一致,大于小于都行) 定义的时候尽量保持一致
建表时先建立主表,再建立从表。【主表 被依赖的表 class,从表 studentforeigntest 】
删除时要先删除从表,再删除主表。
从表添加数据的外键列的值必须在主键列中存在,如果不存在,加不进去。但是可以为空。
正确示例: primary key
create table class(id number primary key,uname varchar2(20));
create table studentforeigntest(id number primary key , classId number references class(id));
drop table class;--删除失败
错误示例:
create table studentforeigntest(id number primary key , classId number references class(id));--创建失败
正确示例: unique
create table class(id number unique,uname varchar2(20));
create table studentforeigntest(id number primary key , classId number references class(id));
约束 check 检查
用于强制数据必须满足的条件。【同where语句的写法】
create table checkTest(id number check(id>10 and id <100),uname varchar2(20));
insert into checkTest(uname) values ('张三');--不传值可以
insert into checkTest values (1,'张三');--报错
insert into checkTest values (15,'张三');
主键和unique的区别
一个表可以有多个unique,但是只能有一个主键。
unique的值可以为空,但是主键不可以。
primary key的所在列,会自动创建索引,但是unique不会。
建议:
我们每张表都应该有一个主键,但是不一定需要unique。
综合案例
论坛用户信息注册
客户姓名不能为空 且唯一
手机号码不能重复 作为主键
客户的性别必须是男或女 默认是男
create table userInfo(
uname varchar2(20) not null unique,-- 主键只能有一个
phone number(11) primary key,
gender char(2) default '男' check(gender in ('男','女'))
);
默认值 default
create table testdefault(
id_number number primary key,
id_name varchar2(20) default '默认名称'
);
insert into testdefault values(1,null);--没有默认名称
insert into testdefault values(2,'');--没有默认名称
insert into testdefault(id_number) values (3);--有默认名称 --开发使用较多
insert into testdefault values(4,default);--有默认名称
insert into testdefault values(5,'default');--写入default
建表之后增加约束
create table userInfo2(
uname varchar2(20),
phone number(11),
gender char(2)
);
增加非空约束 使用modify
写法:alter table 表名 modify 列名 not null;