Oracle 约束
admin
2023-05-12 07:22:19
0

一、约束的概念

通俗来讲,约束是为了使被填入的数据更加符合业务规范、保证数据完整性而开发设计的手段。

如果进行的DML(更新、插入、删除行)或DDL(此处指ALTER更改操作)操作不合符业务规范(约束)要求,则数据库会拒绝请求;

约束既可以是表级约束也可以是列级约束,需要强调的是notnull 一定是列级的。

在定义约束的时候,正常应该按照语法格式和命名规则进行定义,如若没有给出约束的名称,则Oracle会给约束按照SYS_Cn(n为自然数,由Oracle根据流水生成),如SYS_C001684,推荐大家还是养成良好的学习习惯,正确命名约束;

二、Oracle约束分类

非空(NOT NULL)约束、 唯一(UNIQUE)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束、条件(CHECK)约束、REF约束。

三、Oracle约束关系比照图

约束名

中文含义

约束

类型

命名规范

特征

备注说明

NOT NULL

非空约束

C

NN_表名_列名

不允许空值

只能定义在列上

UNIQUE

唯一值约束

U

UK_表名_列名

值不允许重复,但是可以为NULL并且NULL可以有多个,因为NULL<>NULL,组合列个数不能超过32个。

需要定义UNIQUE的列不能是主键列,即一个列不能既有主键约束又有UNIQUE约束

PRIMARY KEY

主键约束

P

PK_表名

值不能重复并且不能为NULL,组合列个数不能超过32个。

一个表或视图只能有一个主键

FOREIGN KEY

外键约束

R

FK_表名_列名

存的父表主键的值,与父表存在依赖关系,插入新值时,如果外键的值在父表中没有则无法插入;

外键是把双刃剑,在增加子父表关系验证的同时,牺牲了oracle数据性能,现在大型数据设计中会避免使用外键。

CHECK

条件约束

C

CK_表名_列名

自定义的约束检查,按照开发设计者的要求进行定义,比如要求检查输入值的符合某个范围,比如年龄列需要大于等于1岁小于邓宇120  CHECK(AGE BETWEEN 1 AND  120)

约束条件定义灵活

 

四、约束查看

1、  DBA_CONSTRAINTS:数据库中所有的约束定义

2、  ALL_CONSTRAINTS:用户有权限查看的表的约束;

3、  USER_CONSTRAINTS:属于当前登陆用户创建的约束;

约束视图中关键字段说明

OWNER:约束创建人

CONSTRAINT_NAME:约束的名字

CONSTRAINT_TYPE:约束的类型,参照上图

SEARCH_CONDITION:可以通过点击大文本进行查阅约束具体内容

STATUS:约束当前的状态,是否有效

五、约束创建

1、  约束正常情况下应当在表设计、创建时定义完整,如若使用中发现需要定义某种约束,这需要首先处理不符合规范要求的数据然后再行定义约束并且时间越早越好。

2、  下面我们会使用CREATETABLE 时创建约束,包括NOT NULLPRIMARY KEYFOREIGN KEYUNIQUE以及CHECK约束。

SQL>CREATETABLEconstraint_test (

                                                    cno VARCHAR2(4) PRIMARYKEY,

                                                               cname VARCHAR2(40) UNIQUE,

                                                               cdate  DATE                     DEFAULTTO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')    NOTNULL)

3、  下面是使用ALTER 方式进行后续追加约束的方式

--增加一列备注(note)列,并且要求使用CHECK约束检查只能输入字母的字符串

SQL>ALTERTABLE constraint_test ADD note VARCHAR2(100);

SQL>ALTERTABLE constraint_test ADD CONSTRAINT ck_constraint_test_note 

CHECK(REPLACE(TRANSLATE(UPPER(note),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','A'),'')  IS NOT NULL);

六、约束删除
1、语法格式:ALTERTABLE【表名】 DROPCONSTRAINT【约束名】;

2、举例:ALTERTABLE constraint_test DROPCONSTRAINTck_constraint_test_note;

 

七、约束重命名

1、  语法格式:

ALTERTABLE【表名】RENAME CONSTRAINT【旧约束名】TO【旧约束名】;

2、举例:ALTERTABLE constraint_test RENAMECONSTRAINTnn_constraint_test_note TO ck_constraint_test_note;

八、禁用约束

1、  语法格式:

ALTERTABLE【表名】DISABLECONSTRAINT【约束名】CASCADE;

2、  举例:

ALTERTABLE constraint_test DISABLECONSTRAINTck_constraint_test_note [CASCADE];

3、  说明1cascade是一个可选选项,例如父表中的主键是子表的外键,如果我们想禁用父表中的主键约束效果同时也禁用字表的外键约束,此时就可以启用CASCADE 这个参数;

4、  说明2:如果禁用约束会被Oracle自动创建索引(如主键、外键、unique等),在禁用该约束的同时也会删除该约束对应的索引,这显然对于大数据表来说使我们不想看见的,所以我可以在禁用约束的时候选择保留索引,方法是:

ALTERTABLE【表名】DISABLECONSTRAINT【约束名】INDEX;

九、启用约束

1、  语法格式:

ALTERTABLE【表名】ENABLECONSTRAINT【约束名】INDEX;

2、  说明:我们在禁用主键和外键的时候,可以通过禁用父表的主键后加cascade的方式进行偷懒,但是如果重新启用,则需要单独一一启用;

十、        约束状态

ENABLE(可用)、VALID(有效)、INVALID(无效)、DISABLE(禁用)

十一、  关于使用约束的建议

1、应该在创建表的时候就定义好所需的各种Oracle约束。如果没有的话,应尽可能早地加上所需要的Oracle约束,这样会使系统更可靠,更容易维护;(这个视具体情况而言)

2、  Oracle系统进行过多的约束检查会大大的降低Oracle数据库系统的效

十二、  十二、约束章节其他

1、  不能在视图上指定字段为NULL或者 NOT NULL

2、  使用主键、外键的报表在删除的时候,必须依照先删除字表后删除父表顺序进行操作,或者在父表删除语句后加cascade关键字,推荐一步步操作;

 


相关内容

热门资讯

自己系的铃,自己来解 作者 | 雷墨编辑 | 阿树5月14日上午,中美两国元首举行了长达2小时15分钟的会谈。这是继201...
高校大门开放争议背后:一个人的... 5月13日,武汉大学宣布取消社会公众进校预约制度,公众凭身份证即可入校。这意味着学校自2023年7月...
三星承诺将打造更节能的智能家电... IT之家 5 月 14 日消息,据外媒 Sammobile 今日报道,三星签署了欧盟关于互操作性和能...
朱雀二号改进型遥五运载火箭发射... 中新社北京5月14日电 (记者 马帅莎)记者从蓝箭航天获悉,北京时间5月14日11时,朱雀二号改进型...
Aria Networks C... AI网络初创公司Aria Networks于今年4月高调亮相,同期完成1.25亿美元融资,并对AI基...
俄外交部:对与日方接触持开放态... 当地时间5月14日,就日本政府此前发表的有关日俄关系的言论,俄罗斯外交部发言人扎哈罗娃表示,俄对与日...
打造AI影像协作实验场 上影节... 上海国际电影节全新单元“AI片场”开机 打造AI影像协作实验场 “我做AI电影已经两年了。”德国AI...
我国首次成功批量克隆超高产奶山... 西北农林科技大学14日向新华社记者独家披露,学校羊遗传改良与生物育种创新团队攻克关键核心技术,6只超...
医学院硕博研究生靠虚开发票冒签... 33岁的柴某系江苏人,案发前系某医院博士后研究人员。一审法院认定,2018年至2023年,柴某在某医...
京东618自营电脑桌椅服务升级... 随着京东心动购物季开启,职场人、居家办公族及电竞爱好者的“久坐刚需”升级需求集中释放,电脑桌椅品类迎...