您好,登录后才能下订单哦!
一、约束的概念
通俗来讲,约束是为了使被填入的数据更加符合业务规范、保证数据完整性而开发设计的手段。
如果进行的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 NULL,PRIMARY KEY,FOREIGN KEY,UNIQUE以及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、 说明1:cascade是一个可选选项,例如父表中的主键是子表的外键,如果我们想禁用父表中的主键约束效果同时也禁用字表的外键约束,此时就可以启用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关键字,推荐一步步操作;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。