主键约束

意义:

防止出现重复数据-实体完整性

检索有利

因为主键是唯一的标识一条记录,那么,通过将主键作为搜寻条件,可以最快最方便的获得目标数据

支持外键

如果在表A上建立外键,并将外键指向表B,那么B必须创建主键

主键约束简介

主键列的数据类型不一定是数值型

主键列来源于主码,而主码与数据类型无关,因此主键不一定是数值型

主键不一定只有一列

为什么是单列主键

首先,在数据检索时,往往利用主键作为查询条件,那么单列情况下,只需搜索一个条件,而联合主键要使用多个条件,这会降低效率和增加维护成本。

为什么是自增型的数值型主键

自增的数值型主键最受欢迎,当数据库迁移,数据合并,会对主键产生影响,但是处理这种主键的成本是最小的

主键不能为空

创建主键约束

create table 表名 (列1 数据类型1 primary key,列2 数据类型2,...)

创建多列主键

create table employees(employee_id number,employee_name varchar2(20),employee_position varchar2(20),employee_age number,employee_address varchar2(50),primary key(employee_name,employee_address));

primary key(employee_name,employee_address)用于创建主键

创建表后,添加主键约束

alter table 表名 add primary key (列1,列2...)

为主键命名

alter table 表名 add constraint 约束名称 primary key (列1,列2)

add constraint用于为表添加约束,并指定约束名称

alter table employees drop primary key

删除表主键

禁用/启用主键

alter table 表名 disable primary key

disable primary key用于禁用主键,因为主键的唯一性,一次无须指定主键名称

alter table 表名 enable primary key

启用主键

重命名主键

alter table 表名 rename constraint 原住建名称 to 新主键名称

主键与索引

索引是数据库提供的一种可以用于提高数据性能的机制,当用户在数据表的某列(或某些列)上创建了索引,在检索时又使用了该索引列,Oracle可以很快的捕获符合的记录,而不必用全表扫描的方式。

当Oracle创建主键时,会自动创建一个与主键同名的索引。索引列与主键列相同,但是,当用户重命名主键后,索引不会重命名。但是会随着主键的删除而删除。

当Oracle创建主键时,会首先查看主键列上是否已经创建了索引。如果未创建,则自动创建;如果以创建,则直接创建主键,不创建索引。因存在的索引也和主键没有任何连带关系,当删除主键时,不会触发索引的任何动作。

create index ind_employee on employees(employee_id)

create index用于创建索引,ind_employee是索引名称,on employee(employee_id)是索引创建在表employees的employee_id列上

外键约束

参照完整性

在2个表之间,一个表中的记录依附于另一个表而创建,称为表之间的参照完整性。

创建外键约束

alter table 表名 add constraint 约束名 foreign key (外键列名) references 主表(主表主键列)

alter table purchase_order add constraint fk_purchase_order foregin key(customer_id) references customer(customer_id)

级联更新和级联删除

级联更新指当主表中的主键列进行修改时,子表的外键列也应进行相应的修改。

级联删除指当主表中的记录删除时,子表中与之相关的记录也应删除

级联更新

Oracle并未提供级联更新的直接解决方案,但可以通过延迟校验策略实现

创建延迟校验外键约束语法:

alter table 表名 add constraint 外键名称 foregin key(外键列)references 主表名(主表主键列) deferrable initially deferred

deferrable initially deferred表示新建约束使用了延迟校验机制。

即时校验(默认的)指当Oracle执行了一条sql语句,立即验证该语句是否仍能保持数据完整性。

延迟校验指当整个事务结束时,才验证。一个失误可以包含多个sql语句,因此可以先修改主表,再修改从表

假如违反了完整性,那么事务将回滚,并保持表中数据不变

级联删除

在创建外键时直接指定

alter table 表名 add constraint 外键名称 foregin key(外键列) references 主表名(主表主键列)on delete cascade

on delete cascade指定外键采用级联删除机制

此处的级联删除指,当删除主表中的某条记录时,Oracle会自动搜索并删除从表的相关记录

外键约束的相关操作

重命名

alter table purchase_order rename constraint fk_purchase_order to fk_po 

禁用/启用外键

在数据库迁移时,如果存在外键约束,不仅会降低效率,而且有可能会导致数据插入失败。此时,使用延迟校验也不好。因为在迁移过程中,有可能执行多次事务提交。禁用外键约束更好

禁用:
alter table purchase_order disable constraint fk_po

启用:

alter table purchase_order enable constraint fk_po

是否校验已有数据的参照完整性

对于数据库迁移,的确存在不符合参照完整性的数据,用户无法很快判断和处理这些异常,但又必须立即启用外键约束,以保证今后新数据的参照完整性。此时应该采用忽略已有数据参照完整性

alter table purchase_order enable onvalidate constraint fk_po

enable onvalidate constraint fk_po指启用外键约束时忽略对已有数据的校验

删除外键

alter table purchase_order drop constraint fk_po

唯一性约束

唯一性约束和主键有一定的相似性

二者共同点

1、都可以限制表中记录的唯一性

2、都可以建立在单列或列的组合上

不同点

1.表中允许的个数不同,主键只能有一个,唯一性约束没有数量上的限制

2.唯一性约束的列值可以为空

3.唯一性约束创建时不会连带创建索引

创建唯一性约束

alter table 表名 add constraint 约束名称 unique(列1,列2...)

删除唯一性约束

alter table employees drop constraint unq_employee

unq_employee是该约束名称

重命名唯一性约束

alter table 表名 rename constraint 原约束名 to 新约束名

禁用/启用唯一性约束

alter table 表名 disable/enable constraint 约束名

检查约束

检查数据的有效性,比如,开始日期必须大于结束日期

检查约束实质是一个布尔表达式,一旦在数据表上创建了检查约束,那么改检查约束将在数据更新时计算布尔表达式的值。如果为真,校验通过,更新成功,否则会禁止更新

创建检查约束

alter table 表名 add constraint 约束名 check(布尔表达式)

alter table student_score add constraint chk_score check(score>=0 and score<=100)

重命名检查约束

alter table 表名 rename constraint 原约束名 to 新约束名

禁用/启用检查约束

alter table 表名 disable/enable constraint 约束名

删除检查约束

alter table employees drop constraint unq_employee

默认值约束

在插入语句时不想为某列显式的赋值时,如,表contract的列status的新纪录往往是有效(act),可以为该列指定默认值。当用户在插入数据时,不对该列显式赋值。那么act就自动填充。从而减少工作量,提高效率

注意:Oracle 9i以前的版本,用户设置默认值时,只能使用常量值;而9i及以后的版本,用户将可以使用sysdate等函数设定列的默认值

创建默认值约束

创建默认值约束应使用modify选项,并制定约束类型为default(默认值)

alter table contract modify status default ‘ACT’

指定表contract的列status的默认值为‘act’

查看默认值约束

默认值约束并非表的属性,而是列的属性,因此无法在数据字典User_constraints中获取其信息

select table_name,column_name,data_type,data_length,data_default from user_tab_columns where table_name='contract' and column_name='status'

利用函数设置默认值约束

alter table contract modify start_date default(sysdate)

修改默认值约束

默认值约束的主要操作为删除默认值约束,删除方式其实就是把其默认值设为null

alter table contract modify(start_date default null,status default null)

非空约束

创建非空约束

alter table 表名 modify(列名 not null)

查看非空约束和查看默认值约束一样

修改非空约束

alter table debit modify (debit_person null)
posted on 2018-02-07 16:45  NE_STOP  阅读(10)  评论(0编辑  收藏  举报  来源