oracle约束键解析Word文档下载推荐.docx
《oracle约束键解析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《oracle约束键解析Word文档下载推荐.docx(42页珍藏版)》请在冰豆网上搜索。
那个和主键约束差不多
Addunique(列名)
三、外键约束
好多的同学一直也都不明白得外键约束,到底什么才是外键?
主键在那个表上?
外键在那个表上?
用T-SQL语句写的时候是主表在前,依旧外间表在前?
等等一系列的问题!
接下来我讲给大伙儿说说那个主外键到底如何弄的。
事实上,主外键之间正如它的名字一样,他们之间有一个主从关系,一个主表,一个从表,主表上面设置的是主键,从表上面设置的是外键(foreignkey),主键表中的数据发生变化的时,外键(foreignkey)表的数据赶忙就发生改变。
Ⅰ向已有的表中添加一个主键(没有确实是添加,添加确实是修改表)
Addforeignkey(列名1)referencestable2(列名2)
Ⅱ创建表的时候一同创建外键
(列名4数据类型是否为空primarykey,
列名1数据类型referencestable2(列名2)
注:
Table1外键表
Table2主键表
列名1是主表列
列名2是外键表列
最一样常用的是主表的列和外键表的列的字段是一样的
一样多为ID能够作为主键的。
这是两个之间的交互。
四、Check约束
他也是基于一个表中的约束,限定表中列直截了当爱你数据的参照关系。
Ⅰ向一个以创建的表中添加约束
Altertabeltable1
Addconstraint约束名check(列名关于列的限制条件)
多是一些能够找到范畴的数据,例如年龄,身高,体重。
五、default默认约束
他是一个关于某一个值的约束,他是唯独的一个用for关联词的句子
向表中添加一个默认约束
Altertabletable1
Adddefault‘默认值’for列名
六、删除约束
删除约束也是关于表的修改故:
Dropconstraint约束名
上面确实是我所明白得的一些约束。
想要记住他们并不难
1开头的一样差不多上altertable表名或是createtable表名
2在已有的表中添加约束用alter
3与表同时创建用create
4他们所有的关键字:
主键约束:
primarykey
唯独性约束:
unique
外键约束:
froeignkey….references(参照)…..[两个表之间的关系,该是互相参照]
查询约束:
…..constraint(约束)…….check[对字段查询,对字段约束]
默认约束:
…….default………….for(给)…….将前面默认的值给后边的字段
ORACLE约束总结
2019-05-1308:
36by潇湘隐者,682visits,
收藏,
编辑
你对ORACLE约束的了解如何?
比较模糊依旧相当透彻?
假如你对下面几个问题了如指掌的话,恭喜你,你差不多对约束把握得比较好了,不用看这篇文章了。
ORACLE的约束有啥功能作用?
有哪些类型约束(不同版本ORACLE是否不同)?
视图有约束吗?
约束是否会阻碍SQL性能?
约束信息储备在哪些系统视图、数据字典中?
约束能否修改名称?
能否禁用约束?
延迟约束有啥好处.......
约束定义
约束是强加在表上的规则或条件。
确保数据库满足业务规则。
保证数据的完整性。
当对表进行DML或DDL操作时,假如此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行那个操作。
约束能够是列一级别的也能够是表级别的。
定义约束时没有给出约束的名字,ORACE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称。
).
约束功能
约束的功能:
实现一些业务规则,防止无效的垃圾数据进入数据库,爱护数据库的完整性(完整性指正确性与一致性)。
从而使数据库的开发和爱护都更加容易。
约束分类
约束分为6类:
非空(NOTNULL)约束、唯独(UNIQUE)约束、主键(PRIMARYKEY)约束、外键(FOREIGNKEY)约束、条件(CHECK)约束、REF约束。
非空(NOTNULL)约束:
顾名思义,所约束的列不能为NULL值。
否则就会报错
唯独(UNIQUE)约束:
在表中每一行中所定义的这列或这些列的值都不能相同。
必须保证唯独性。
否则就会违法约束条件。
主键(PRIMARYKEY)约束:
唯独的标识表中的每一行,不能重复,不能为空。
创建主键或唯独约束后,ORACLE会自动创建一个与约束同名的索引(UNIQUENES为UNIQUE唯独索引)。
需要注意的是:
每个表只能有且有一个主键约束。
外键(FOREIGNKEY)约束:
用来爱护从表(ChildTable)和主表(ParentTable)之间的引用完整性.外键约束是个有争议性的约束,它一方面能够爱护数据库的数据一致性,数据的完整性。
防止错误的垃圾数据入库;
另外一方面它会增加表插入、更新等SQL性能的额外开销,许多系统里面通过业务逻辑操纵来取消外键约束。
例如在数据仓库中,就举荐禁用外键约束。
条件(CHECK)约束:
表中每行都要满足该约束条件。
条件约束既能够在表一级定义也能够在列一级定义。
在一列上能够定义任意多个条件约束。
REF约束的定义:
REFcolumnbydefinitionreferencesanobjectinanotherobjecttypeorinarelationaltable.AREFconstraintletsyoufurtherdescribetherelationshipbetweentheREFcolumnandtheobjectitreferences.
ORACLE11数据库的约束类型如下:
ORACLE10数据库的约束类型如下:
在oracle官方文档:
//docs.oracle/cd/B19306_01/server.102/b14237/statviews_1037.htm下
C (checkconstraintonatable)
P (primarykey)
U (uniquekey)
R (referentialintegrity)
V (withcheckoption,onaview)
O (withreadonly,onaview)
:
//docs.oracle/cd/B28359_01/server.111/b28286/clauses002.htm
//docs.oracle/cd/B28359_01/server.111/b28320/statviews_1044.htm#REFRN20047
C Checkconstraintonatable
P Primarykey
U Uniquekey
R Referentialintegrity
V Withcheckoption,onaview
O Withreadonly,onaview
H Hashexpression
F ConstraintthatinvolvesaREFcolumn
S Supplementallogging
关于H、S类型,尚不清晰情形,而且从上面我在11g数据库实验结果看,也没发觉这两种类型。
(有了解的朋友能够告知一二)
约束命名规范
约束名称建议自己定义一套命名规则,否则使用系统生成的约束名,专门难能把它和对应的表、字段联系起来。
非空约束 NN_表名_列名
唯独约束 UK_表名_列名
主键约束 PK_表名
外键约束 FK_表名_列名
条件约束 CK_表名_列名
默认约束 DF_表名_列名
假如约束名称超过32位长度,建议应该缩写表名,而不应用NN_表名_数字。
只是具体视情形而定,专门多时候DF_表名_列名如此命名,往往超出了32字符。
因此有时候需要缩写表面或是采纳其它规则。
约束操作
约束治理
创建各类约束
先看一下如何创建主键约束
CREATETABLE"
DM"
."
DEPT"
(
"
DEPTNO"
NUMBER(2,0)PRIMARYKEY,
DNAME"
VARCHAR2(14),
LOC"
VARCHAR2(13)
)TABLESPACE"
TBS_DM_DAT"
;
COMMENTONTABLE"
IS'
部门表'
;
COMMENTONCOLUMN"
部门编号'
部门名称'
COMMENTONCLOUMN"
部门所在地点'
现在它的约束名称是系统创建的。
如图所示:
假如我们以下面的脚本创建,现在约束如下所示
1CREATETABLE"
2(
3"
NUMBER(2,0) ,
4"
VARCHAR2(14) ,
5"
VARCHAR2(13) ,
6CONSTRAINT"
PK_DEPT"
PRIMARYKEY("
)USINGINDEXTABLESPACETBS_DM_IN
7)TABLESPACE"
8
9
10
11
12COMMENTONTABLE"
13
14COMMENTONCOLUMN"
IS'
15
16COMMENTONCOLUMN"
17
18COMMENTONCLOUMN"
19
假如一个表的约束类型比较多,你会看到一堆SYS_CN如此的约束,假如不认真核对后面的字段,专门难一眼看出约束类型、约束对应字段。
主键约束的限制
文档原文如下:
(翻译在下)
RestrictionsonPrimaryKeyConstraintsPrimaryconstraintsaresubjecttothefollowingrestrictions:
Atableorviewcanhaveonlyoneprimarykey.
一个表或视图有且只有一个主键
NoneofthecolumnsintheprimarykeycanbeLOB,LONG,LONGRAW,VARRAY,NESTEDTABLE,BFILE,REF,TIMESTAMPWITHTIMEZONE,oruser-definedtype.However,theprimarykeycancontainacolumnofTIMESTAMPWITHLOCALTIMEZONE.
主键字段不能为LOB、LOG、LOGRAW、VARRAY、NESTEDTABLE、BFILE、REF、TIMESTAMPWITHTIMEZONE或用户定义类型。
然而它能够包含TIMESTAMPWITHLOCALTIMEZONE类型的字段。
Thesizeoftheprimarykeycannotexceedapproximatelyonedatabaseblock.
主键大小不能超过一个数据块大小。
Acompositeprimarykeycannothavemorethan32columns.
主键组合键不能超过32列。
Youcannotdesignatethesamecolumnorcombinationofcolumnsasbothaprimarykeyandauniquekey.
你不能指定一列或组合列既是主键又是唯独键。
Youcannotspecifyaprimarykeywhencreatingasubviewinaninheritancehierarchy.Theprimarykeycanbespecifiedonlyforthetop-level(root)view.
创建一个继承层次结构中的子视图时,你不能指定一个主键。
主键能够唯独指定的顶层(根)视图。
外键约束
ALTERTABLEchildTable
ADDCONSTRAINTFK_xxxx_xxx
FOREIGHKEY(columnName)
REFERENCESparentTalbe(primaryKeyColumn)[ONDELETECASCADE|SETNULL];
ONDELETESETNULL子句:
当主表中的一行数据被删除时,Oracle系统会自动地将所有从表中依靠于它的数据记录的外键改成空值;
ONDELETECASCADE:
当主表中的一行数据被删除时,Oracle系统会自动地将所有从表中依靠于它的数据记录删除;
注:
假如在外键定义中使用了ONDELETESETNULL或ONDELETECASCADE,不管删除操作是在父表这一端依旧子表这一端都可不能产生违反引用完整性的问题,然而却留下了安全隐患。
这两个子句要慎重使用,只有在不得已时使用,谨记谨记!
!
外键约束对DML与DDL的阻碍:
INSERT:
只有操作是在子表或从表这一端时才会产生违反引用完整性约束的问题,父表则不然。
DELETE:
只有操作是在父表或主表这一端时才会产生违反引用完整性约束的问题,子表则不然。
UPDATE:
子表父表直截了当操作都会违反引用完整性约束。
两种解决方法:
1)先更新子表的引用列为空,再更新父表的主键的列的值,然后把子表的引用列更新成新的父表的值;
2)使用ONDELETESETNULL,先更新父表,然后将子表外键为空的记录更新为新的值。
DDL语句:
DROPTABLE与TRUNCATETABLE,操作父表,违反引用完整性约束,子表则不然。
外键约束的限制:
RestrictionsonForeignKeyConstraintsForeignkeyconstraintsaresubjecttothefollowingrestrictions:
NoneofthecolumnsintheforeignkeycanbeofLOB,LONG,LONGRAW,VARRAY,NESTEDTABLE,BFILE,REF,TIMESTAMPWITHTIMEZONE,oruser-definedtype.However,theprimarykeycancontainacolumnofTIMESTAMPWITHLOCALTIMEZONE.
外键字段不能为LOB,LONG,LONGRAW,VARRAY,NESTEDTABLE,BFILE,REF,TIMESTAMPWITHTIMEZONE,oruser-definedtype类型,主键能够包含数据类型为TIMESTAMPWITHLOCALTIMEZONE的字段。
Thereferenceduniqueorprimarykeyconstraintontheparenttableorviewmustalreadybedefined.
引用唯独或主键约束,必须是父表中差不多定义的。
Acompositeforeignkeycannothavemorethan32columns.
外键的组合列不能超过32列。
Thechildandparenttablesmustbeonthesamedatabase.Toenablereferentialintegrityconstraintsacrossnodesofadistributeddatabase,youmustusedatabasetriggers.SeeCREATETRIGGER.
字表和父表必须在同一个数据库。
分布式数据库中,外键不能跨节点,但触发器能够
Ifeitherthechildorparentobjectisaview,thentheconstraintissubjecttoallrestrictionsonviewconstraints.See"
ViewConstraints"
.
YoucannotdefineaforeignkeyconstraintinaCREATETABLEstatementthatcontainsanASsubqueryclause.Instead,youmustcreatethetablewithouttheconstraintandthenadditlaterwithanALTERTABLEstatement.
你不能在CREATETABLE语句中包含AS子查询子句定义一个外键约束。
相反,你必须创建一个没有约束的表,然后添加ALTERTABLE语句。
加上一些类似其它约束的限制.
条件约束
非空约束
非空约束的限制:
1:
你不能在视图约束上指定字段为NULL或NOTNULL值
2:
你不能指定一个对象的属性为NULL或NOTNULL。
相反,而应使用的IS[NOT]
NULL条件CHECK约束
条件约束中的条件与查询语句中的条件相同,然而不能包括以下内容:
1)CURRVAL,NETXTVAL,LEVEL和ROWNUM如此的伪列(PSEUDOCOLUMNS);
2)引用其它行中值的查询语句;
3)SYSDATE,USER,USERENV和UID的函数调用。
RestrictionsonNOTNULLConstraintsNOTNULLconstraintsaresubjecttothefollowingrestrictions:
YoucannotspecifyNULLorNOTNULLinaviewconstraint.
YoucannotspecifyNULLorNOTNULLforanattributeofanobject.Instead,useaCHECKconstraintwiththeIS[NOT]NULLcondition.
唯独约束
唯独约束的限制:
RestrictionsonUniqueConstraintsUniqueconstraintsaresubjecttothefollowingrestrictions:
NoneofthecolumnsintheuniquekeycanbeofLOB,LONG,LONGRAW,VARRAY,NESTEDTABLE,OBJECT,REF,TIMESTAMPWITHTIMEZONE,oruser-definedtype.However,theuniquekeycancontainacolumnofTIMESTAMPWITHLOCALTIMEZONE.
当字段类型为LOB、LOG、LONGRAW、VARRAY、NESTEDTABLE、OBJECT、REF、TIMESTAMP、用户定义类型时,不能在字段上定义唯独性约束。
当数据类型为TIMESTAMPWITHLOCALTIMEZONE
Acompositeuniquekeycannothavemorethan32columns.
组合字段定义的唯独索引,字段个数不能超过32个
Youcannotdesignatethesamecolumnorcombinationofcolumnsasbothaprimarykeyandauniquekey.
你不能指定同一字段或组合字段即为主键又是唯