oracle数据库对象--约束

在介绍了表对象的时候我们就接触了约束,当我们定义一个字段为非空(not null)时,或者唯一(unique)时,即为该字段定义了约束(constraint),约束也属于oracle数据库对象之一。下面将简单介绍一下约束,通过本篇的学习,你将学会如果去描述约束,如何去创建和维护约束;

1.什么是约束?
答:约束是对表结构的一种强制规定,即要求表中数据必须要满足约束条件,否则该数据无法存入到表中。

2.常见约束有哪些?
答:常见的约束有五种,不常见的就不提了,因为真的不常见。
- unique:唯一约束,要求在表中该字段必须是唯一的,不能存在重复;
- not null:非空约束,要求该字段在插入的时候不能为空值
- primary key:主键约束,一般一个表定义一个主键,但是也是可以定义多个的,作为该行数据的标识,其实就是要求非空而且唯一;
- foreign key:外键约束,即该字段引用另一个表的主键,后文详细讲解;
- check:检查约束,检查当前字段是否满足某个条件;

1.创建约束:
定义约束我们可以有两种方式,一种是列级约束,一种是表级约束;
列级约束只能定义到一列上,而表级约束可以定义到多个列中,当然也包括一个列
注意:not null约束只能定义在列级约束上面。
格式:列级约束定义在每个列的后面,而表级约束是等所有列定义完后单独定义的。
列级约束定义:
create table 表名(
字段名1 type CONSTRINT 约束名1 约束类型1,
字段名2 type CONSTRINT 约束名 2 约束类型2,
字段名3 type CONSTRINT 约束名3 约束类型3
)
这种约束紧接着列定以后面的我们成为列级定义,一般“CONSTRINT 约束名”也可以不写,这样定义的这个约束名称则由系统指定,Oracle server 自动按照 SYS_Cn 的格式指定约束名

eg:
create table users(
uid number(12) constraint users_uid_pk primary key,
uname varchar2(6) not null,
uage number(3)
)
表级约束定义:
create table 表名(
字段名1 type ,
字段名2 type ,
字段名3 type ,
CONSTRAINT 约束名 约束类型(字段名,[字段名,字段名]),
CONSTRAINT 约束名 约束类型(字段名)
)
eg:
create table users(
uid number(12) ,
uname varchar2(6) not null,
uage number(3)
,
constraint users_uid_pk primary (uid)
)
其实列级定义和表级定义区别不大,可根据适当情况选择,比如很多字段都需要定义unique约束,我们就不必每一列都定义了,可以使用表级方式一下定义多个,其他情啥没了区别了.

2.维护约束
很多时候我们在创建表的时候就已经创建了约束了,但是万事都有考虑不全面的时候,万一我突然想加个约束,或者想把某一个约束删了该如何处理呢,也就是如何去维护一个约束呢。
添加一个约束:语法格式如下
ALTER TABLE table_name ADD CONSTRAINT 约束名称 约束类型(列名);
如:alter table users add constraint users_uname unique (uname);
常用的是通过这种方式,但是对于not null约束只能用修改列的modify方法
eg:alter table users modify(uname varchar2(6) not null);

删除约束
ALTER TABLE 表名 DROP CONSTRINT 约束名;
eg:alter table users drop constraint user_uid_pk;

还有额外的两个不怎么常用的,就是使其失效(diisable),和激活(ENABLE)失效的约束。
失效:
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk;

激活:
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk;

查询约束
在查询约束的时候我们是从数据字典视图里面查询:user_constraints。
select constraint_name,constraint_type,search_condition from
user_constraints where table_name = ‘users’

查询定义约束的列
我们使用的是 user_cons_columns
select constraint_name,column_name from user_cons_columns
where table_name =’users’


外键 foreign key
前面介绍的的五种约束中,个人觉得除了外键要着重介绍一下之外,其余的没啥要说的,唯一要注意的是,not null只能通过列级定义,这里在简单介绍一下foreign key。
外键的定义是,该列的所有值一般是引用其他表的主键值,注意是引用,所以当别人主键表没这个值时,你也没法设置新值。

定义示例:
create table departments(
department_id number(10) primary key,
department_name varchar2(20) not null,
job_id number(10)
)

create table employees (
eid number(10) primary key,
department_id numer(10) constraint emp_dep_fk reference departments(department_id),

下面通过表级方式定义外键
–department_id numer(10),
constraint emp_dep_fk foreign key (department_id) reference departments(department_id)
)
上面示例中就像我们展示了,employees表中的department_id 是如何引用到departments表中的departments的dipartment_id的,此时在employees这一列则作为外键存在。
语法格式:
字段名 type constraint 约束名

添加一个外键约束:
alter table employees add constraint emp_dep_fk foreign key (department_id) reference departments(department_id);

注意点:
1.外键的值出来运行多个null值,除了了null值以为其余所有的值都必须在所引用的主键值中,无法插入和更新主键值中没有的值。
2.我们可以通过在创建外键时添加 on delete cascade (级联删除) on delete set null(级联置空),on update cascade (级联更新)
这样我们的主键表的主键修改时,就可以把外键表的 引用的值也一起修改了,否则当存在引用时,主键表无法删除和修改。
eg:
create table employees (
eid number(10) primary key,
department_id numer(10) constraint emp_dep_fk reference departments(department_id) on delete cascade,on update cascade,

下面通过表级方式定义外键
–department_id numer(10),
constraint emp_dep_fk foreign key (department_id) reference departments(department_id)
)

3.外键表的外键值修改是影响不了主键表的,但是修改的值还是必须要在主键表中存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值