表的约束与索引

本文介绍了如何在Oracle数据库中实现表的实体完整性和参照完整性,包括使用主键和外键约束,以及如何添加check约束确保数据的有效性。此外,还讲解了不同类型的索引创建方法,如B树索引、位图索引和唯一索引。

一、实体完整性(通过主键)

1.创建表

   create table nn(id varchar2(12),name varchar2(20));

 2.增加约束

  alter table nn add constraint pk_nn primary key(id);

 

二、参照完整性(通过外键1)

 1.创建表

   SQL> create table mm(id varchar2(12) not null primary key,
  2  mname varchar2(20),nid varchar2(12));

表已创建。

 

2.增加外键约束

SQL> alter table mm add constraint fk_mn foreign key(nid) references nn(id);

 

SQL> select * from nn;

未选定行

SQL> insert into nn values('1','lili');

已创建 1 行。

SQL> insert into mm values('1','sal','2');
insert into mm values('1','sal','2')
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SCOTT.FK_MN) - 未找到父项关键字


SQL> insert into mm values('1','sal','1');

已创建 1 行。

SQL>

 

3.增加check约束

 

   SQL> alter table mm add constraint ck_mm_check check(mname='男' or mname='女');
alter table mm add constraint ck_mm_check check(mname='男' or mname='女')
                              *
第 1 行出现错误:
ORA-02293: 无法验证 (SCOTT.CK_MM_CHECK) - 违反检查约束条件


SQL> select * from mm;

ID           MNAME                NID
------------ -------------------- ------------
1            sal                  1

SQL> update mm set mname ='男';

已更新 1 行。

SQL> alter table mm add constraint ck_mm_check check(mname='男' or mname='女');

表已更改。

SQL>

 

检查

SQL> insert into mm values(2,'nihao','1');
insert into mm values(2,'nihao','1')
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.CK_MM_CHECK)


SQL>

 

三、查看约束

 SQL> select table_name,constraint_name,constraint_type from user_constraints;

TABLE_NAME                     CONSTRAINT_NAME                C
------------------------------ ------------------------------ -
MM                             CK_MM_CHECK                    C
MM                             FK_MN                          R
MM                             SYS_C005394                    C
EMP                            FK_DEPTNO                      R
DEPT                           PK_DEPT                        P
EMP                            PK_EMP                         P
NN                             PK_NN                          P
MM                             SYS_C005395                    P

已选择8行。

SQL>

 

四、索引

1.建立索引

  SQL> create index mm_index on mm(nid);(B树索引)

索引已创建。

 
SQL> select * from mm where nid = '001';

 

2.建立位图索引(适合有大量重复数据,也就说数据量大,但数据值很少,多为重复)

SQL> create bitmap index my_bitmap_index on mm(mname);

索引已创建。

SQL>

 

3.唯一索引

 SQL> create unique index mm_unique_index on nn(name);

索引已创建。

 

 

 -- 查询被指定表引用的父表
select
c.owner
||'.'||c.table_name child_table,
c.constraint_name,
r.owner
||'.'||r.table_name parent_table
from dba_constraints c,dba_constraints r
where c.owner=r.r_owner and c.constraint_name=r.r_constraint_name
and c.owner=upper('&child_owner') and c.table_name=upper('&child_table');

-- 查询引用指定表的子表
select
c.owner
||'.'||c.table_name child_table,
c.constraint_name,
r.owner
||'.'||r.table_name parent_table
from dba_constraints c,dba_constraints r
where c.owner=r.r_owner and c.constraint_name=r.r_constraint_name
and r.owner=upper('&parent_owner') and r.table_name=upper('&parent_table');

### 数据库约束索引的定义 数据库约束是一种用于强制实施数据完整性的机制,它通过设定特定规则来确保中存储的数据满足一定的业务逻辑和一致性要求。常见的约束类型包括主键约束(PRIMARY KEY)、外键约束(FOREIGN KEY)、唯一约束(UNIQUE)、检查约束(CHECK)以及非空约束(NOT NULL)。这些约束可以防止非法数据进入数据库[^1]。 索引则是数据库管理系统提供的一种快速访问数据的技术手段。它是基于中的某些列构建的一个特殊结构,能够显著加快查询操作的速度。常用的索引类型包括B-Tree索引、哈希索引、全文索引等。每种类型的索引适用于不同的查询模式和场景[^3]。 --- ### 约束索引的主要区别 #### 功能上的差异 - **约束**主要用于保障数据的一致性和完整性,其核心目标是控制哪些数据可以被插入或修改到中。 - **索引**则专注于提升查询性能,减少检索时间成本,而不直接影响数据的有效性验证过程[^1]。 #### 实现方式的不同 - 唯一约束可以通过创建唯一索引来实现,但这并不意味着两者完全相同。当定义了一个唯一约束时,底层通常会自动建立相应的唯一索引以支持这一约束条件。然而,单独设置唯一索引并不会触发任何额外的约束行为,仅作为加速重复值检测的功能存在[^1]。 - 对于其他类型的约束(如外键),它们的工作原理独立于索引之外,并依赖于数据库引擎内部复杂的事务处理流程完成跨参照关系管理等工作[^4]。 --- ### 应用场景分析 #### 数据库约束的应用场合 - 当需要保证某列或多列组合在整个格范围内具有唯一性的时候应该考虑采用`UNIQUE CONSTRAINTS`或者`PRIMARY KEYS`; - 如果希望限制某一字段只接受指定范围内的数值,则可运用`CHECK CONSTRAINTS`; - 针对那些不允许为空白项的关键属性建议施加`NOT NULL RESTRICTIONS`. #### 各类索引适合解决的问题领域 - B树型别的索引非常适合做精确匹配以及有序排列的结果集获取任务,在大多数情况下都能带来明显的速度改进效果[^2]。 - 而像Hash这样的专用形式更适合处理相等判断密集型负载下的高效定位需求[^2]。 - 至于涉及大量文本资料搜索的任务,则推荐选用Full-text Indexes这类专门针对自然语言处理设计出来的高级工具[^3]。 此外值得注意的是,在实际部署过程中还需要综合考量诸如空间占用率、维护开销等因素的影响程度以便做出更加合理的选择决策[^5]。 ```sql -- 创建带有主键和唯一约束示例 CREATE TABLE employees ( id INT PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, department_id INT FOREIGN KEY REFERENCES departments(id), salary DECIMAL CHECK (salary >= 0) ); -- 添加复合索引的例子 CREATE INDEX idx_employee_department_salary ON employees(department_id ASC, salary DESC); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值