数据的完整性
用于确保数据库数据遵从一定的商业和逻辑规则,比如数据库中存储的是林木的信息,如果包含性别则不符合此要求。
数据完整性可以使用约束、触发器、应用程序(过程,函数)三种方式来实现。
这三种方法中,因为约束易于维护,并且有最好的性能,所以作为维护数据完整性的首选。
约束有5种
not null--------非空,必须提供数据
unique----------唯一,不能重复,可以为null
primary key-----主键,不能重复且不为空,用于唯一的标示表行的数据,一张表只能有1个主键,但是可以有多个unique。联合主键:意思是多列一起做主键,比如mesh+id
foreign key-----外键,定义主表和从表之间的关系,外键约束要定义在从表上,主表必须有主键约束或是unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在,或是为null。
check-----------检查,比如要求性别必须是男或女。
create table goods(
goodsId char(8) primary key,
goodsName varchar2(40),
unitprice number(10,2) check(unitprice>0),
category varchar2(8),
provider varchar2(40)
)
create table cumtomer(
customerId char(8) primary key,
name varchar2(50) not null,
address varchar2(50),
email varchar2(50) unique,
sex char(2) default '男' check(sex in('男','女')),
cardId char(18)
)
如果是外键,需要保证字段类型和长度与主键一致
create table purchase(
customerId char(8) references costomer(custormerId),
goodsId char(8) references goods(goodsId),
nums number(3) check (nums between 1 and 30)
)
alter table 可以修改表结构,增加约束
not null 使用modify
其他约束使用add即可
alter table goods modify goodsName not null;
alter table customer add constraint aaa1 unique(cardId); aaa1是约束的名称,自己命名
alter table customer add constraint aaa1 check(address in('朝阳','海淀','东城','西城'));
删除约束
alter table 表名 drop constraint 约束名称;(当时起的约束名称)
删除主键约束时,可能有错误,因为如果在2张表存在主从关系时,在删除主表的主键约束时,必须带上caseade选项(级联),如像:
alter table 表名 drop primary key caseade;
显示约束信息
通过查询数据字典视图user_constraints,可以显示当前用户的所有约束的信息
select constraints_name ,constraints_type ,status,validated from user_constraints where table_name='表名';
显示约束列
通过查询数据字典视图user_cons_columns,可以显示约束所对应的表列信息
select column_name ,position from user_cons_columns where constraint_name='约束名';
也有更简单容易的方法,直接用pl/sql 查看即可。
列级定义,在定义列的同时定义约束
如
create table department(dept_id number(2) constraint sss1 primary key,
name varchar2(12),
loc varchar2(12)
);
constraint sss1 primary key 和primary key 效果是一样的,如果简写,则程序会分配一个随机的名字
表级定义,指在定义了所有的列过后,再定义约束。注意,not null只能在列级上定义
如
create table emp(
emp_id number(4),
name varchar2(15),
dept_id number(2),
constraint sss1 primary key(emp_id),
constraint sss2 foreign key(dept_id) references department(dept_id)
);
用于确保数据库数据遵从一定的商业和逻辑规则,比如数据库中存储的是林木的信息,如果包含性别则不符合此要求。
数据完整性可以使用约束、触发器、应用程序(过程,函数)三种方式来实现。
这三种方法中,因为约束易于维护,并且有最好的性能,所以作为维护数据完整性的首选。
约束有5种
not null--------非空,必须提供数据
unique----------唯一,不能重复,可以为null
primary key-----主键,不能重复且不为空,用于唯一的标示表行的数据,一张表只能有1个主键,但是可以有多个unique。联合主键:意思是多列一起做主键,比如mesh+id
foreign key-----外键,定义主表和从表之间的关系,外键约束要定义在从表上,主表必须有主键约束或是unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在,或是为null。
check-----------检查,比如要求性别必须是男或女。
create table goods(
goodsId char(8) primary key,
goodsName varchar2(40),
unitprice number(10,2) check(unitprice>0),
category varchar2(8),
provider varchar2(40)
)
create table cumtomer(
customerId char(8) primary key,
name varchar2(50) not null,
address varchar2(50),
email varchar2(50) unique,
sex char(2) default '男' check(sex in('男','女')),
cardId char(18)
)
如果是外键,需要保证字段类型和长度与主键一致
create table purchase(
customerId char(8) references costomer(custormerId),
goodsId char(8) references goods(goodsId),
nums number(3) check (nums between 1 and 30)
)
alter table 可以修改表结构,增加约束
not null 使用modify
其他约束使用add即可
alter table goods modify goodsName not null;
alter table customer add constraint aaa1 unique(cardId); aaa1是约束的名称,自己命名
alter table customer add constraint aaa1 check(address in('朝阳','海淀','东城','西城'));
删除约束
alter table 表名 drop constraint 约束名称;(当时起的约束名称)
删除主键约束时,可能有错误,因为如果在2张表存在主从关系时,在删除主表的主键约束时,必须带上caseade选项(级联),如像:
alter table 表名 drop primary key caseade;
显示约束信息
通过查询数据字典视图user_constraints,可以显示当前用户的所有约束的信息
select constraints_name ,constraints_type ,status,validated from user_constraints where table_name='表名';
显示约束列
通过查询数据字典视图user_cons_columns,可以显示约束所对应的表列信息
select column_name ,position from user_cons_columns where constraint_name='约束名';
也有更简单容易的方法,直接用pl/sql 查看即可。
列级定义,在定义列的同时定义约束
如
create table department(dept_id number(2) constraint sss1 primary key,
name varchar2(12),
loc varchar2(12)
);
constraint sss1 primary key 和primary key 效果是一样的,如果简写,则程序会分配一个随机的名字
表级定义,指在定义了所有的列过后,再定义约束。注意,not null只能在列级上定义
如
create table emp(
emp_id number(4),
name varchar2(15),
dept_id number(2),
constraint sss1 primary key(emp_id),
constraint sss2 foreign key(dept_id) references department(dept_id)
);