Oracle约束

时间:2024-03-10 15:14:18

约束

  作用:确保数据库满足特定的商业规则。

      解释例如某个表的字段中,性别只能规定男和女,年龄不能为负数等一些规则。

   主要包括:not null  、 unique  、primary  keyforeign 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代表与其他表之间的连带关系一并删除。

 Oracle约束