关于约束的创建、启用和停止
2024-06-25 本文已影响0人
moutory
前言
oracle作为关系型数据库的典范,推荐开发人员在应用过程中使用外键约束、非空约束等约束来保障数据的一致性和稳定性,但是这种约束在某些时候可能会带来一定的困扰,尤其是需要删除数据或者迁移数据的时候,让我们的操作变得繁琐,实际上oracle对于约束的使用是比较灵活的,它支持我们在创建和启用约束后,通过关闭约束的操作来实现数据的删除和迁移。
话不多说,下面进入正题
(一)创建约束
语法:alter table table_name add constraint constraint_name [constraint_type] (columnName);
- 主键约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column1); - 唯一性约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column1); - 外键约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column1) REFERENCES referenced_table (referenced_column); - 检查约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (column1 > 0); - 非空约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (column1 IS NOT NULL); - 级联约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column1) REFERENCES referenced_table (referenced_column) ON DELETE CASCADE ON UPDATE CASCADE;
(二)启用/停止约束
1、启用索引
- 使用
enable (validate)
模式
alter table table_name enable constraint constraint_name; - 使用
enable novalidate
模式,启用约束,创建索引,仅对新加入的数据强制执行约束,而不管表中的现有数据.
alter table table_name enable novalidate constraint constraint_name;
2、 禁用外键约束
-
使用
disable( novalidate)
模式
关闭约束,删除索引,可以对约束列的数据进行修改等操作.
alter table table_name disable constraint constraint_name; -
使用
disable validate
模式
关闭约束,删除索引,不能对表进行 插入/更新/删除等操作.
alter table table_name disable validate constraint constraint_name;
简而言之,disable validate
模式保持了数据的完整性,不允许任何可能违反约束的操作
(三)查看表对象的约束
我们可以通过user_constraints
视图来查看用户下所有的constraint约束、所属表名、所属用户和状态信息等等。其中,CONSTRAINT_TYPE
表示约束的类型,对应关系可以看下文的解释。
![](https://img.haomeiwen.com/i24009055/c655a56f5dc59bfb.png)
constraint_type值及其含义:
P - 主键(Primary Key)约束。确保表中的每行都有一个唯一的标识符。
U - 唯一性(Unique)约束。确保列或列的组合中的所有值都是唯一的,但允许有空值。
R - 外键(Foreign Key)约束。用于维护两个表之间的链接,确保引用的数据的完整性。
C - 检查(Check)约束。用于限制列中可以插入的数据值,以满足特定的条件。
V - 视图(View)约束。虽然不是标准的约束类型,但有时在某些上下文中可能用于标识视图。
E - 排除(Exclude)约束。这是一种特殊类型的约束,用于确保在表中不会插入重复的行。
R_C - 域(Domain)约束。用于限制特定域内的数据值。
S - 序列(Sequence)约束。虽然序列本身不是约束,但它们可以用于生成满足特定约束的值。
T - 触发器(Trigger)约束。虽然触发器不是直接的约束类型,但它们可以用于强制约束。