扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一、约束的概念
武平网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联从2013年开始到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
通俗来讲,约束是为了使被填入的数据更加符合业务规范、保证数据完整性而开发设计的手段。
如果进行的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 (
cnoVARCHAR2(4)PRIMARYKEY,
cnameVARCHAR2(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>ALTERTABLEconstraint_testADD CONSTRAINTck_constraint_test_note
CHECK(REPLACE(TRANSLATE(UPPER(note),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','A'),'') IS NOT NULL);
六、约束删除
1、语法格式:ALTERTABLE【表名】DROPCONSTRAINT【约束名】;
2、举例:ALTERTABLE constraint_testDROPCONSTRAINTck_constraint_test_note;
七、约束重命名
1、 语法格式:
ALTERTABLE【表名】RENAME CONSTRAINT【旧约束名】TO【旧约束名】;
2、举例:ALTERTABLE constraint_testRENAMECONSTRAINTnn_constraint_test_noteTO ck_constraint_test_note;
八、禁用约束
1、 语法格式:
ALTERTABLE【表名】DISABLECONSTRAINT【约束名】CASCADE;
2、 举例:
ALTERTABLE constraint_testDISABLECONSTRAINTck_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关键字,推荐一步步操作;
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流