约束
作用:确保数据库满足特定的商业规则。
解释:例如某个表的字段中,性别只能规定男和女,年龄不能为负数等一些规则。
主要包括:not null 、 unique 、primary key、foreign key 和 check 五种
not null:很简单,表示该字段不能为空值
unique:表示字段不能重复,是唯一的
primary key:主键
foreign key: 外键
check : 约束,例如规定性别只能男女
SQL> create table goods( goodsId char(8) primary key, --主键 goodsName varchar2(30), unitprice number(10,2) check(unitprice>0), category varchar2(8), provider varchar2(30) ); SQL> create table customer( customerId char(8) primary key, --主键 name varchar2(50) not null, --不为空 address varchar2(50), email varchar2(50) unique, --唯一 sex char(2) default '男' check(sex in ('男','女')), -- 一个char能存半个汉字,两位char能存一个汉字 cardId char(18) ); SQL> create table purchase( customerId char(8) references customer(customerId), goodsId char(8) references goods(goodsId), nums number(10) check (nums between 1 and 30) ); 表是默认建在SYSTEM表空间的
下面做一个简单的例子来使用这个约束
商店售货系统表的设计:
商店的数据库,用来记录客户及购物情况,这里由下面三张表组成:
商品表(goods): 客户表(customer): 购买表(purchase):
商品号:goodsId 客户号:customerId 客户号:customerId
商品名:goodsName 姓名:name 商品号:goodsId
单价:unitprice 住址:addrss 购买数量:nums
商品类别:category 邮箱:email
供应商:provider 性别:sex
身份证:cardId
声明:
1.每个表的主外键
2.客户的姓名不能为空
3.单价必须大于0,且购买数量必须在1到30之间
4.邮箱不能重复
5.客户的性别必须是男或者女,默认是男。
商品表:
1 create table goods ( 2 goodsId char(8) primary key, --定义主键 3 goodsName varchar2(50), 4 unitPrice number(10,2), 5 category varchar2(30), 6 provider varchar2(30));
顾客表:
1 --顾客表 2 create table customer( 3 customerId char(8) primary key, 4 name varchar2(50), 5 address varchar2(50), 6 email varchar2(50) unique, 7 sex char(2) default '男' check(sex in ('男','女')), 8 cardId char(18)); 9
购买表:
1 --购买表 2 create table purchase ( 3 customerId char(8) references customer(customerId), --外键 4 goodsId char(8)references goods(goodsId), --外键 5 nums number(10) check(nums between 1 and 30));
那么在表创建好之后,发现需要添加约束怎么办呢?
介绍两种定义:列级定义和表级定义
列级定义:在建表的同时,就将约束加上去
表级定义:表创建完成后,再单独为其增加约束
建表时忘记建立必要的约束,可以用表级定义,alert table 命令为表增加约束。
注意:增加not null约束时,需要使用modify选项,其他用add选项
alter table goods modify goodsName not null;
alter table customer add constraint cardUnique unique(cardId); --阴影部分为约束的名称
alter table customer modify name not null;
alter table customer add constraint addresCheck check(address in ('婺源','北京','上海','南京','武汉','大连','哈尔滨'));
对应的删除约束的方法是(注意cascade):
alter table 表名 drop constraint 约束名称
alter table 表名 drop primary key ;
alter table 表名 drop primary key cascade;
注释:cascade代表与其他表之间的连带关系一并删除。