约束
开发工具与关键技术:Oracle
作者:吴东梅
撰写时间:2019-04-10
NOT NULL --非空约束
UNIQUE --唯一性约束
PRIMARY KEY --主键约束
FOREIGN KEY --外键约束
CHECK --检查性约束
注意事项
•如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
•创建和修改约束:
–建表的同时
–建表之后
•可以在表级或列级定义约束
•可以通过数据字典视图查看约束
表级约束和列级约束
•作用范围:
①列级约束只能作用在一个列上
②表级约束可以作用在多个列上(当然表级约束也 可以作用在一个列上)
•定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
1、NOT NULL 约束
(1)保证列值不能为空: (2) 只能定义在列级:
CREATE TABLE test1(
test1_id NUMBER(6),
name VARCHAR2(25) NOT NULL, --系统命名
salary NUMBER(8,2),
);
创建表成功之后,往加了not null约束的列里面插入空值,则会报以下的错:

2、UNIQUE 约束
唯一约束,允许出现多个空值:NULL。
可以定义在表级或列级:
如果有了唯一约束,再往那个定义唯一约束的列里面插入一个相同的信息,则会报以下的错:

3、PRIMARY KEY 约束 (主键约束)
可以定义在表级或列级:
既不能重复也不能为空。自带唯一性。
CREATE TABLE test1(
test1_id NUMBER(4),
test1_name VARCHAR2(30),
CONSTRAINT test1_pk PRIMARY KEY(test1_id)
);
给ID加了主键约束,那么在插入数据的主键相同时则会报以下的错误,因为主键自带既不能重复也不能为空。

4、FOREIGN KEY 约束 (外键约束)
可以定义在表级或列级:
FOREIGN KEY: 在表级指定子表中的列 foreign key
REFERENCES: 标示在父表中的列 references
ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
ON DELETE SET NULL(级联置空): 子表中相应的列置空
特别注意:外键约束
1、外键约束的定义是,让另一张表的记录来约束自己。这里的另一张表就是主表。
2、当主表的记录删除时,我们可以跟随主表删除记录(ON DELETE CASCADE)、或者相应的字段设置为空(ON DELETE SET NULL)、或者不允许删除(默认)。
注意一:当主表被级联删除(DORP TABLE WEN CASCADE CONSTRAINTS)时,从表建立的与主表关联的外键约束将被删除,从表(外表)数据不会发生变化。
3、假设从表(外表)为另一个表外键约束对应的主表,该外键约束关系不会受到影响。
注意二:从表外键约束指向的主表字段,必须是唯一性约束或主键约束的字段。因为,当外键约束指向的主表记录有重复项时,删除其中之一时,从表伴随操作不明朗。
5、CHECK 约束
•定义每一行必须满足的条件
加了检查约束条件的列,再插入数据的时候,不符合检查条件的时候,则会报以下的错误:

在创建表的时候加入约束有以下两种方法:
–方法一(这种方法是把每一个约束定义在列上面,列级定义)
create table emp10(
employee_id number(6) primary key,
last_name varchar2(25) not null,
email varchar2(25) constraint emp10_u unique,
salary number(8,2) check (salary > 20000 and salary < 50000),
commission_pct number(2,2),
hire_date date not null,
department_id number(4),
foreign key(department_id) references departments (department_id)
);
创建成功之后,我们可以利用查询定义的列的方法去把刚刚创建的约束查询出来,如下图就是上面的方法在创建表的时候定义的约束,约束名可以自己定义,也可以由系统自定义。如下图

–方法二,如果不指定约束名,Oracle server 自动按照 SYS_Cn 的格式指定约束名。
create table emp11(
employee_id number(6),
last_name varchar2(25),
email varchar2(25),
salary number(8,2),
commission_pct number(2,2),
hire_date date,
department_id number(4),
foreign key (department_id) references departments(department_id) on delete cascade,
primary key (employee_id),
check (salary>20000),
unique(email)
);
下图就是上面方法二在创建表的时候定义的约束,因为没有自定义约束名,所以约束名都是自动按照 SYS_Cn 的格式指定约束名,可以对比一下是这个表只定义了四个约束。如下图:

添加约束的语法
使用 ALTER TABLE 语句:
•添加或删除约束,但是不能修改约束
•有效化或无效化约束
•添加 NOT NULL 约束要使用 MODIFY 语句
添加约束
Alter table test1 add UNIQUE(name);
执行添加约束的语句之后,下图就是用查询定义约束的方法把刚刚添加的约束查询出来了,因为我没有自定义约束名,所以就是系统命名,这也就意味着添加约束成功。如下图:

添加约束的时候,要注意,如果要对某一列添加非空约束,那么就要使用modify语句,不能用add语句,否则就会报错,无法添加成功。添加not null 非空约束的方法如下:自定义约束名
1、Alter table test1 modify( name varchar2(10) CONSTRAINT cs_fk not null);
用查询定义约束的方法你就会看到约束名就是我们刚刚自定义创建的约束名,意味着添加成功。

删除约束
ALTER TABLE test1 – test1表名
DROP CONSTRAINT cs_fk; --cs_fk 约束名
使用上面的删除约束的方法,执行完成之后,再次查询约束,你会发现刚刚添加的约束已经被删除了。如下图:

无效化约束
•在ALTER TABLE 语句中使用 DISABLE 子句将约束无效化。
毋庸置疑就是这个约束是存在的,但是并没有发挥作用。
我们先给test1 表的name 值添加上非空约束,然后在用给这个约束用无效化约束的方法把这个约束进行无效化:
ALTER TABLE test1
DISABLE CONSTRAINT cs_fk; --无效化非空约束 cs_fk 约束名
用以上的无效化约束方法把非空约束无效化之后,查询定义约束的时候,这个约束是存在的,但是我对这个定义了非空约束的列插入空值时,已经成功插入了数据,证明这个约束已经被无效化成功了。如下图:

激活约束
ENABLE 子句可将当前无效的约束激活。
可以把约束无效化,那么也能把无效化的约束进行激活。
•当定义或激活 UNIQUE(唯一约束) 或 PRIMARY KEY(主键约束) 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引。
1、ALTER TABLE test1
ENABLE CONSTRAINT CS_FK; --激活无效化的约束
把前面已经进行无效化的约束的在这里进行激活,用上面的激活约束的方法激活成功之后,再次把空值插入定义了非空约束的那列,此时约束就会发挥作用,报以下下面的错:如下图:

到此,约束分析完毕。
查询表级约束
select * from USER_CONSTRAINTS;
查询定义约束的列 (EMP10是表名)
select * from USER_CONS_COLUMNS where table_name = ‘EMP10’;
本文详细介绍了Oracle数据库中的约束类型,包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY和CHECK约束,以及它们的作用、定义方式和注意事项。还讨论了列级约束与表级约束的区别,并提供了创建、修改和删除约束的示例。
1546

被折叠的 条评论
为什么被折叠?



