ORACLE的约束

一、验证约束

1.验证约束

如果约束处于验证状态,则在定义或激活约束时,Oracle将对表中所有已有的记录进行验证,检查是否满足约束限制。

2.非验证约束

如果约束处于非验证约束,则在定义或激活约束时,Oracle将对表中已有记录不执行验证操作。

 

如果将禁止、激活、验证和非验证状态相互组合,则可以将约束分为4中状态,如下表:

状态说明
激活验证状态
(ENABLE VALIDATE)
默认状态。Oracle不仅对以后添加和更新的数据进行约束检查,也会对已经存在的数据检查约束
激活非验证状态
(ENABLE NOVALIDATE)
Oracle只对以后添加和更新的数据进行约束检查
禁止验证状态
(DISABLE VALIDATE)
Oralce对已经存在的数据检查约束,但是不允许对表执行添加和更新操作
禁止非验证状态
(DISABLE NOVALIDATE)
无论是表中已存在的记录,还是以后添加和更新的操作,Oracle都不进行约束检查

 

切换约束状态的SQL语句:

ALTER TALBE table_name

MODIFY CONSTRAINT constraint_name [DIS|EN]ABLE  [NO]VALIDATE;

 

二、延迟约束

在延迟约束下,Oralce对添加和更新的数据,不会立即执行约束检查,这样用户可以改变检查的时机,如将约束检查放在事务结束后进行。

INITIALLY DEFERRED约束的初始状态是延迟检查
INITIALLY IMMEDIATE约束的初始状态是立即检查

 

SQL语句:

ALTER TALBE table_name

MODIFY CONSTRAINT constraint_name INITIALLY [DEFERRAED | IMMEDIATE];

 

三、检查约束信息

1.USER_CONSTRAINTS中的约束信息

USER_CONSTRAINTS视图中部分列的说明

类型说明
ownerVARCHAR2(30)约束的所有者
constraint_nameVARCHAR2(30)约束名
constraint_typeVARCHAR2(1)约束类型(P、R、C、U、V、O)
table_nameVARCHAR2(30)约束所属的表
statusVARCHAR2(8)约束状态(ENABLE、DISABLE)
deferrableVARCHAR2(14)约束是否也延迟(DEFERRABLE、NOTDEFERRABLE)
deferredVARCHAR2(9)约束是立即执行还是延迟执行(IMMEDIATE、DEFERRED)

2.USER_CONS_COLUMNS中的约束列

USER_CONS_COLUMNS视图中部分列的说明

类型说明
ownerVARCHAR2(30)约束的所有者
constraint_nameVARCHAR2(30)约束名
table_nameVARCHAR2(30)约束所属的表
column_nameVARCHAR2(4000)约束所定义的列
### 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、付费专栏及课程。

余额充值