Oracle数据库开发SQL基础:05 约束

约束

数据类型可以说是控制输入数据的格式,而约束则是控制输入的数据满足一些特定的要求。

  • 约束的作用
    约束最重要的一个作用是用来定义规则,比如哪些字段是必须要输入的,哪些字段的值应该在一个怎么样的范围之内等,定义的一定的规则之后,就可以确保数据的完整性(即精确性和可靠性),就可以防止输入一些错误的或者无效的信息。
  • 五类约束
    1. 非空约束
    2. 主键约束
    3. 外键约束
    4. 唯一约束
    5. 检查约束

1.非空约束(非空约束没有名字)

  • 在创建表时设置非空约束
    使用NOT NULL设置:
CREATE TABLE table_name(
    column_name datatype NOT NULL,...
 );

还是以userinfo表为例,表中有ID、USERNAME、USERPWD、REGDATE四个字段。

create table userinfo
(id, number(6,0), 
 username varchar2(20) not null,
 userpwd varchar2(20) not null,
 regdate date);
  • 在修改表时添加非空约束
    在修改表时添加非空约束,被约束字段不能已经存在空值。
ALTER TABLE table_name
MODIFY column_name datatype NOT NULL;
  • 在修改表时去除非空约束
ALTER TABLE table_name
MODIFY column_name datatype NULL;

2. 主键约束

作用:确保表中每一行数据的唯一性,要求主键是非空并且唯一的。
在一张表中只能设置一个主键约束,但是主键约束可以由多个字段来构成(联合主键或复合主键)。

  • 在创建表时设置主键约束
方法一
CREATE TABLE table_name(
    column_name datatype PRIMARY KEY, ...
);
方法二
...创建字段...
CONSTRAINT constraint_name
PRIMARY KEY(column_name1,...);		
例如:
create table userinfo
(id number(6,0),
 username varchar2(20),
 userpwd varchar2(20),
 regdate date,
 constraint pk_id_username primary key(id, username));

查看约束的名字
通过数据字典user_constraints可以查看某张表的约束名字:

select constraint_name from user_constraints where table_name='USERINFO';

没有特别声明的约束,名称由系统自动生成。

  • 在修改表时添加主键约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
PRIMARY KEY (column_name1,...);
例如
alter table userinfo
add constraint pk_id primary key(id);

同样,修改为主键的字段内的数据内容要符合主键约束,在设定主键之前表中最好没有数据。

  • 更改约束的名称(注意约束的名字需要是唯一的)
ALTER TABLE table_name
RENAME CONSTRAINT old_name
TO new_name;
  • 删除主键约束
禁用/启用约束
ALTER TABLE table_name
DISABLE|ENABLE CONSTRAINT constraint_name;
查看约束状态
select constraint_name,status from user_constraints where table_name='USERINFO';
删除约束
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;  或者
DROP PRIMARY KEY[CASCADE]    --CASCADE用于级联删除

3. 外键约束

外键约束是唯一一个涉及两个表当中字段关系的约束。

  • 在创建表时设置外键约束
方法一
CREATE TABLE table1
(column_name datatype REFERENCES
table2(column_name), ...);

其中table2称为主表,table1称为从表,
设置外键约束时,主表的字段必须是主键,主从表中相应的字段必须是用一个数据类型,
从表中外键字段的值必须来自主表中相应字段的值,或者为null值。
例如:

创建主表
create table typeinfo
(typeid varchar2(10) primary key,
 typename varchar2(20));
创建从表
create table userinfo_f
(id varchar2(10) primary key,
 username varchar2(20),
 typeid_f varchar2(10) references typeinfo(typeid));
方法二
...创建字段...
CONSTRAINT constraint_name FOREIGN
KEY(column_name) REFERENCES
table_name(column_name) [ON DELETE CASCADE];    --级联删除
例如:
create table userinfo_f
(id varchar2(10) primary key,
 username varchar2(20),
 typeid_f varchar2(10),
 constraint fk_typeid_f foreign key(typeid_f) references typeinfo(typeid));
  • 在修改表时添加外键约束
ALTER TABLE table_name1
ADD CONSTRAINT constraint_name FOREIGN 
KEY(column_name) REFERENCES 
table_name2(column_name) [ON DELETE CASCADE];
  • 删除外键约束
禁用/启用外键约束
ALTER TABLE table_name
DISABLE|ENABLE CONSTRAINT constraint_name;
删除外键约束
DROP CONSTRAINT constraint_name;

4. 唯一约束

作用:使设置了唯一约束的字段当中的值唯一。
唯一约束和主键约束的区别:
主键字段的值必须是非空的,而唯一约束允许有一个空值,主键在每张表中只能有一个,而唯一约束可以有很多个。

  • 在创建表时设置唯一约束
方法一
CREATE TABLE table_name
(column_name datatype UNIQUE,...);
方法二
...创建字段...
CONSTRAINT constraint_name
UNIQUE(column_name);		--多个字段的设定要使用多条constraint子句
例如
create table userinfo
(id varchar2(10) primary key,
 username varchar2(20),
 constraint un_username unique(username));
  • 在修改表时添加唯一约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
UNIQUE(column_name);
  • 删除唯一约束
禁用/启用唯一约束
ALTER TABLE table_name
DISABLE | ENABLE CONSTRAINT constraint_name;
删除唯一约束
DROP CONSTRAINT constraint_name; 

5. 检查约束

作用:让表中的值更具有实际意义,比如员工信息管理系统,记录了员工的年龄、工资等信息,检查约束可以让这些数据的值满足一定条件从而具有实际意义。

  • 在创建表时设置检查约束
方法一
CREATE TABLE table_name
(column_name datatype CHECK(expressions),...);
例如
create table userinfo
(id varchar2(10) primary key,
 username varchar2(20),
 salary number(7,0) check(salary>0));
方法二
...创建字段...
CONSTRAINT constraint_name
CHECK(expressions);		
  • 在修改表时添加检查约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
CHECK(expressions);
  • 删除检查约束
禁用/启用检查约束
ALTER TABLE table_name
DISABLE | ENABLE CONSTRAINT constraint_name;
删除检查约束
DROP CONSTRAINT constraint_name;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值