Oracle 约束

一、维护数据的完整性
概述:数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则。在Oracle中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。


1、约束

约束用于确保数据库数据满足特定的商业规则。在Oracle中,约束包括:not null、unique、primary key, foreign key和check五种。
A、not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供数据。
B、unique(唯一)
当定义了唯一约束后,该列值是不能重复的,但是可以为null。
C、primary key(主键)
用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为NULL。一张表最多只能有一个主键,但是可以由多个unique约束。
D、foreign key(外键)
用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。
E、check

用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在1000~2000之间就会提示出错。

综合案例:
商品售货系统表设计案例
现在有一个商店的数据库,记录客户及其购物情况,由下面三个表组成:
商品表Goods(商品号GoodsId,商品名GoodName,单价UnitPrice,商品类别Categroy,供应商Provider)
客户表Customers(客户号CustomerId,姓名Name,住址Address,电邮Email,性别Gender,身份证CardId)
销售表Purchases(客户号CustomerId,商品号GoodsId,购买数量Num)
请用SQL语言完成下列功能:
建表,在定义中要求声明:
(1)每个表的主外键。
(2)客户的姓名不能为空值。
(3)单价必须大于0,购买数量必须在1~30之间。
(4)电邮不能够重复。
(5)客户的性别必须是男或女,默认是男。
CREATE TABLE goods 
  ( 
     goodsid   CHAR(8) PRIMARY KEY, 
     goodname  VARCHAR2(30), 
     unitprice NUMBER(10, 2) CHECK(unitprice>0), 
     category  VARCHAR2(8), 
     provider  VARCHAR2(30) 
  );
CREATE TABLE customers 
  ( 
     customerid CHAR(8) PRIMARY KEY, 
     name       VARCHAR2(30) NOT NULL, 
     address    VARCHAR2(150), 
     email      VARCHAR2(100) UNIQUE, 
     gender     CHAR(2) DEFAULT('男') CHECK(gender IN('男', '女')), 
     cardid     CHAR(18) 
  );
CREATE TABLE purchases 
  ( 
     customerid CHAR(8) REFERENCES customers(customerid), 
     goodsid    CHAR(8) REFERENCES goods(goodsid), 
     num        NUMBER(10) CHECK(num BETWEEN 1 AND 30) 
  ); 


2、添加约束

如果在建表时忘记建立必要的约束,则可以在建表后使用alter table命令为表增加约束,但是要注意:增加not null约束时,需要使用modify选项,而增加其他四种约束使用add选项。
(1)增加商品名也不能为空
ALTER TABLE goods 
  MODIFY goodsid NOT NULL;
(2)增加身份证也不能重复
ALTER TABLE customers 
  ADD CONSTRAINT uq_cardid UNIQUE(cardid);
(3)增加客户的住址只能是海淀、朝阳、东城、西域
ALTER TABLE customers 
  ADD CONSTRAINT ck_address CHECK(address IN ('海淀','朝阳','东城','西域'));


3、删除约束

当不再需要某个约束时,可以删除。
alter table 表名 drop constraint 约束名称;
特别说明:
在删除主键约束的时候,可能有错误。比如
alter table 表名 drop primary key;
这是因为如果在两表存在主从关系,那么在删除主表主键约束时,必须带上cascade选项。
alter table 表名 drop primary key cascade;


4、显示约束信息

A、显示约束信息
通过查询数据字典视图user_constraints,可以显示当前用户所有的约束的信息。
SELECT constraint_name, 
       constraint_type, 
       status, 
       validated 
FROM   user_constraints 
WHERE  table_name = 'Goods'; 
B、显示列约束
通过查询数据字典视图user_cons_column,可以显示约束所对应的表列信息。
SELECT column_name, 
       position 
FROM   user_cons_columns 
WHERE  constraint_name = 'CK_Address';


5、表级定义和列级定义

A、表级定义
表级定义是指在定义了所有列后,再定义约束,这里需要注意,not null约束只能在列级上定义。
案例:
CREATE TABLE goods 
  ( 
     goodsid   CHAR(8), 
     goodsname VARCHAR2(50), 
     category  VARCHAR(30), 
     CONSTRAINT pk_goodsid PRIMARY KEY(goodsid) 
  );
B、列级定义
列级定义是在定义列的同时定义约束。
案例:
CREATE TABLE goods 
  ( 
     goodsid   CHAR(8) CONSTRAINT pk_goodsid PRIMARY KEY, 
     goodname  VARCHAR2(50), 
     unitprice NUMBER(10, 2) CHECK(unitprice>0), 
     category  VARCHAR(30), 
     provider  VARCHAR(100) 
  ); 
### Oracle 数据库中的约束Oracle数据库中,约束用于强制实施数据完整性规则。通过定义这些规则,可以确保输入到中的数据满足特定条件,从而维护数据的一致性和准确性。 #### 主要的约束类型及其功能 1. **NOT NULL** 这种类型的约束防止列接受NULL值。一旦设置了此约束,在该列上不允许插入任何未指定的数据[^2]。 2. **UNIQUE** UNIQUE约束保证一列或多列组合中的所有值都是唯一的。这意味着在一个具有唯一键约束的字段里不能有两个相同的值存在。这有助于保持实体之间的关系不被破坏。 3. **PRIMARY KEY** PRIMARY KEY是由一个或多个非空(即带有 NOT NULL 属性)且唯一的列组成的特殊形式的UNIQUE约束。它用来唯一标识每一行记录,并作为其他之间建立关联的基础。 4. **FOREIGN KEY** FOREIGN KEY约束指定了两个间的关系,其中一个称为父而另一个为子。外键通常指向另一张里的主键或者候选键,以此来维持参照完整性。当尝试向子添加新纪录时,如果对应的父中不存在匹配项,则操作会被拒绝。 5. **CHECK** CHECK约束允许设定某些条件下才能插入或更新某列上的值。例如,可以通过设置年龄大于0这样的简单达式来限定用户的出生日期范围;也可以更复杂地涉及多列间的逻辑运算。 #### 创建约束格实例 下面给出了一些如何创建包含不同种类约束的新的例子: ```sql CREATE TABLE employees ( employee_id NUMBER(6), first_name VARCHAR2(20), last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn NOT NULL, email VARCHAR2(25) CONSTRAINT emp_email_uk UNIQUE, hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL, job_id VARCHAR2(10) CONSTRAINT emp_job_nn NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), CONSTRAINT emp_salary_min CHECK (salary > 0), -- 检查工资必须大于零 CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id) ON DELETE SET NULL,-- 外部键引用部门并设为空 CONSTRAINT pk_emp PRIMARY KEY(employee_id)-- 设置主键 ); ``` 上述SQL语句展示了怎样利用多种约束来构建一张名为`employees`的工作人员信息单。这里包含了对姓名、电子邮件地址以及雇佣日期等属性施加的不同层次的要求,同时还建立了与其他相关联对象——比如部门——之间的联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值