day05_oracle各种约束示例

约束的概念:

约束是在表中定义的用于维护数据库完整性的一些规则。通过为表中的字段定义约束,可以防止将错误的数据插入到表中。

注意:

1.如果某个约束只作用于单独的字段,既可以在字段级定义约束,也可以在表级定义约束;但如果某个约束将作用于多个字段,必须在表级定义约束。

2.oracle中的约束通过名称来进行识别。在定义约束时可以通过constraint关键字为约束命名。

如果用户没有为约束指定名称,oracle将自动为约束建立默认的名称。

一、

主键约束(primary key):

主键约束的特点:

定义为主键约束的字段中不能包含任何重复值,并且不能包含null值。

同1个表中只能定义1个主键约束。

可以为一个字段定义主键约束,也可以为多个字段的组合定义主键约束。

oracle会自动为具有主键约束的字段建立1个唯一索引和1个非空约束。

例如:

create table person

(

p_id int primary key,        --定义该字段为主键约束【字段级约束】

p_name varchar2(20),

p_age int

);

insert into person(p_id) values(1);

insert into person(p_id) values(2);

insert into person(p_id) values(null);

create table person2

(

p_id int constraint pk_person2 primary key,    --定义该字段为主键约束,并指定约束名字【字段级约束】

p_name varchar2(20),

p_age int

);

create table person3

(

p_id int,

p_name varchar2(20),

p_age int,

constraint pk3_person3 primary key (p_id,p_name)--定义复合主键,并指定名字【表级约束】

);

insert into person3(p_id,p_name) values(1,‘1‘);

insert into person3(p_id,p_name) values(1,‘2‘);

insert into person3(p_id,p_name) values(2,‘1‘);

二、

非空约束(not null):

非空约束的特点:

定义了非空约束的字段中不能包含null值。

只能在字段级定义非空约束。

在同一个表中可以定义多个非空约束。

例如:

create table person4

(

p_id int,

p_name varchar2(20) not null, --定义该列的非空约束

p_age int

);

insert into person4 values(1,null,1);

create table person5

(

p_id int,

p_name varchar2(20) not null, --定义该列的非空约束

p_age int  not null

);

insert into person4 values(1,null,null);

三、

唯一约束(unique):

唯一约束的特点:

定义了唯一约束的字段中不能包含重复值。

可以为1个字段定义唯一约束,也可以为多个字段的组合定义唯一约束。因此,唯一约束既可以定义在字段级,也可以定义在表级。

oracle会自动为具有唯一约束的字段建立1个唯一索引。

对同一字段可以同时定义非空和唯一约束。

如果在1个字段上仅定义了唯一约束,而没有定义非空约束,则该字段可以包含多个null值。

例如:

create table person1

(

p_id int,

p_name varchar2(20) unique,--定义该列的唯一约束

p_age int

);

create table person22

(

p_id int,

p_name varchar2(20) constraint gulaijing unique not null, --同时定义唯一和非空约束

p_age int

);

create table person33

(

p_id int,

p_name varchar2(20),

p_age int,

constraint p_un3 unique(p_name) --指定约束名字

);

四、

外键约束(foreign key)

外键约束的特点:

定义为外键约束的字段中只能包含相应的其他表中引用字段的值或null值。

可以为1个字段定义外键约束,也可以为多个字段的组合定义外键约束。

定义了外键约束的字段和相应的引用字段可以存在于同1个表中,称为自引用。

对同1个字段可以同时定义外键和非空约束。

主表中的被引用列,必须有主键约束或唯一约束。

例如:

create table works(

w_id int ,

w_name varchar2(10)

);

create table works(

w_id int primary key,

w_name varchar2(10)

);

create table person

(

p_id int,

p_name varchar2(20),

p_age int,

w_id int,

constraint p_fk foreign key (w_id) references works(w_id)            --外键约束

);

在定义外键约束时,还可以通过on关键字来指定引用行为的类型。当主表中的一条记录被删除时,需要通过引用行为来确定如何处理子表中的外键列的值。

delete cascade : 指删除父表记录时删除子表中所有的相关记录

delete set null :指删除父表记录时 将所有相关记录的外部码字段值设置为NULL

delete no action: 指删除父表记录时 不做任何操作【默认情况】

create table DEPT2

(

DEPTNO NUMBER(2) not null,

DNAME  VARCHAR2(14)

);

alter table DEPT2 add constraint PK_DEPT2 primary key (DEPTNO);

insert into DEPT2 (DEPTNO, DNAME) values (10, ‘销售部‘);

insert into DEPT2 (DEPTNO, DNAME) values (20, ‘运维部‘);

insert into DEPT2 (DEPTNO, DNAME) values (30, ‘开发部‘);

commit;

delete dept2 where deptno=10;

create table EMP2

(

EMPNO    NUMBER(4) not null,

ENAME    VARCHAR2(10),

DEPTNO   NUMBER(2)

);

(1)

alter table EMP2 add constraint FK_DEPTNO2 foreign key (DEPTNO) references DEPT2 (DEPTNO);

(2)

alter table EMP2 add constraint FK_DEPTNO2 foreign key (DEPTNO) references DEPT2 (DEPTNO) on delete cascade;

(3)

alter table EMP2 add constraint FK_DEPTNO2 foreign key (DEPTNO) references DEPT2 (DEPTNO) on delete set null;

insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7369, ‘SMITH‘,10);

insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7499, ‘ALLEN‘,20);

insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7521, ‘WARD‘,30);

insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7566, ‘JONES‘,40);

insert into EMP2 (EMPNO, ENAME,DEPTNO) values (7654, ‘MARTIN‘,null);

commit;

alter table sys.EMP2  drop constraint FK_DEPTNO2;

检查约束(check)

检查约束的特点:

在检查约束的表达式中必须引用到表中的一个或多个字段,并且表达式的计算结果必须是一个布尔值。

在表达式中不能包含子查询。

在表达式中不能包含sysdate,uid,user,userenv等sql函数,也不能包含rowid,rownum等伪列。

检查约束可以在字段级和表级定义。

对同一个字段可以定义多个检查约束,而且对同一个字段可以同时定义检查约束和非空约束。

例如:

create table person66

(

p_id int,

p_name varchar2(20),

p_age int check(p_age > 20)

);

insert into person66 values(1,‘1‘,11);

insert into person66 values(1,‘1‘,111);

commit;

create table person222

(

p_id int,

p_name varchar2(20),

p_age int constraint check_person_age check(p_age > 20)

);

insert into person222 values(1,‘1‘,11);

create table person333

(

p_id int,

p_name varchar2(20),

p_age int,

constraint p_check3 check(p_age > 20)

);

insert into person333 values(1,‘1‘,11);

-----------------------------额外补充--------------------------------

添加主键约束

alter table table_name add primary key(column_name);

alter table table_name add constraint t_pk primary key(column_name);

添加非空约束

alter table person modify p_name not null;

alter table person modify p_name constraint t_notnull not null;

重命名约束

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

alter table person2 rename hongbanzhang;

删除约束

alter table 表名 drop constraint 约束名;

alter table 表名 drop constraint 约束名 cascade; 删除主键时级联删除子表的外键约束

主键约束还可以如下删除:

alter table person drop primary key;

alter table person drop primary key cascade;

注:删除约束时,默认将同时删除约束所对应的索引,如果要保留索引,用KEEP INDEX关键字

SQL> alter table employees drop primary key keep index

约束失效

alter table 表名  disable constraint 约束名

alter table 表名  disable constraint 约束名 cascade; --失效主键时级联删除子表的外键约束

约束生效

alter table 表名 enable constraint 约束名

novalidate: --不验证老数据

validate:--验证老数据

控制现有数据是否应用约束,例如

alter table t2 enable novalidate constraint SYS_C007211; -- 约束生效,不验证已有数据是否符合约束条件

alter table t2 enable validate constraint SYS_C007211;  -- 约束生效,同时验证已有数据是否符合约束条件

alter table t2 disable validate constraint SYS_C007211;

--约束失效,同时验证已有数据是否符合约束条件,之后不能对该表进行dml操作 ,否则会报ORA-25128错误

alter table t2 disable novalidate constraint SYS_C007211;

-- 约束失效,不验证已有数据是否符合约束条件(默认)

注:约束生效(enable)后的操作都受约束的限制。

来自为知笔记(Wiz)

时间: 2024-10-27 10:20:26

day05_oracle各种约束示例的相关文章

使用sql语句创建和删除约束示例代码

使用sql语句创建和删除约束  约束类型 主键约束(Primary Key constraint) --:要求主键列数据唯一,并且不允许为空.  唯一约束(Unique constraint) --:要求该列唯一,允许为空,但只能出现一个空值.  检查约束(Check constraint) --:某列取值范围限制,格式限制等,如有关年龄.邮箱(必须有@)的约束.  默认约束(Default constraint) --:某列的默认值,如在数据库里有一项数据很多重复,可以设为默认值.  外键约束

C# 泛型多种参数类型与多重约束 示例

1 2 3 4 5 6 7 8 9 10 11 12 interface IMyInterface { } class Dictionary<TKey, TVal>     where TKey : IComparable, IEnumerable     where TVal : IMyInterface {     public void Add(TKey key, TVal val)     {     } }

Oracle之唯一性约束(UNIQUE Constraint)用法详解

Oracle | PL/SQL唯一索引(Unique Constraint)用法 1 目标 用示例演示如何创建.删除.禁用和使用唯一性约束. 2 什么是唯一性约束? 唯一性约束指表中一个字段或者多个字段联合起来能够唯一标识一条记录的约束.联合字段中,可以包含空值. 注:在Oracle中,唯一性约束最多可以有32列. 唯一性约束可以在创建表时或使用ALTER TABLE语句创建. 3 唯一性约束和主键的区别 主键(Primary Key):所有组成主键的列都不能包含空值. 唯一性约束(Unique

FPGA开发全攻略——时序约束

原文链接: FPGA开发全攻略连载之十二:FPGA实战开发技巧(5) FPGA开发全攻略连载之十二:FPGA实战开发技巧(6)(原文缺失,转自:FPGA开发全攻略—工程师创新设计宝典) 5.3.3 和FPGA接口相关的设置以及时序分析5.3.3.1 使用约束文件添加时序约束 一般来讲,添加约束的原则为先附加全局约束,再补充局部约束,而且局部约束比较宽松.其目的是在可能的地方尽量放松约束,提高布线成功概率,减少ISE 布局布线时间.典型的全局约束包括周期约束和偏移约束.在添加全局时序约束时,需要根

Sql Server——约束

约束是什么: 每个人都在网站或者APP上注册过账号,在注册账号时会限制用户名.密码等格式,如果格式不对就不能注册.在数据库中我们可以通过约束来进行限制,超过约束范围的数据就不能写入. 约束的种类: 主键约束:主键列的值不能为空,并且不能重复(主键约束是特殊的唯一约束),有主键约束的列可以被其他表引用,一个表中只能有一个主键约束. 唯一约束:有唯一约束的列中的数据不能重复,但可以为空值(NULL). 检查约束:限制某个列中的数据的取值范围. 默认约束:设置默认约束后的列,在不输入数据的情况下,数据

django ORM的外键操作

外键约束示例 #models操作如下 class HostInfo(models.Model): servername = models.CharField(max_length=32) serverip = models.CharField(max_length=32) serverpassword = models.CharField(max_length=64) server_group = models.ForeignKey("GroupInfo",to_field="

SQL 基础之DDL语句创建和管理表(十四)

数据库对象 Object 描述 表 基本的数据存储集合,由行和列组成 View 从一张表或多张表中抽出的 逻辑上相关的数据集合 序列 生成规律的数值 index 索引 提高查询性能 Synonym 别名 给对象起的别名 表名和列名注意事项: 必须以字母开头 必须在 1–30 个字符之间 必须只能包含 A–Z, a–z, 0–9, _, $, 和 # 必须不能和用户定义的其他对象重名 必须不能是Oracle的保留字 CREATE TABLE  语句 必须具有: – CREATE TABLE 权限

oracle正则表达式

需求: 匹配手机号,第一位可以是+,可以没有+,后面的全部要是数字,如: +861359415665 8613659558555 1356856455 都是合法的. +aa156945555 aa1359556666 aaddssdfdfsd 都是不合法的. 正则: [sql] view plaincopyprint? SQL> SELECT * FROM DUAL WHERE regexp_like('+333333' ,'^[\+]*[[:digit:]]+');      --该+转义或者

xml规范及xml解析

http://www.cnblogs.com/wang-meng/p/5374498.html 1,XML基础介绍 xml的概念: XML 指可扩展标记语言(EXtensible Markup Language),也是一种标记语言,很类似 HTML.           它的设计宗旨是传输数据,而非显示数据它;标签没有被预定义,需要自行定义标签. xml的作用: XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行.简单的说,我们在开发中使用XML主要有以