只想知道 发表于 2015-1-16 22:43:59

MYSQL编程:Oracle数据库的完全性束缚划定规矩

曾经的功能列表可能会迅速变得过时了。而且,有些功能对有的应用程序非常重要,但是对别的应用程序则不一定。oracle|数据|数据库
完全性束缚用于加强数据的完全性,Oracle供应了5种完全性束缚:

   Check
   NOTNULL
   Unique
   Primary
   Foreignkey

  完全性束缚是一种划定规矩,不占用任何数据库空间。完全性束缚存在数据字典中,在实行SQL或PL/SQL时代利用。用户能够指明束缚是启用的仍是禁用的,当束缚启用时,他加强了数据的完全性,不然,则反之,但束缚一直存在于数据字典中。

  禁用束缚,利用ALTER语句

ALTERTABLEtable_nameDISABLECONSTRAINTconstraint_name;
  或

ALTERTABLEpoliciesDISABLECONSTRAINTchk_gender
  假如要从头启用束缚:

ALTERTABLEpoliciesENABLECONSTRAINTchk_gender
  删除束缚

ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name
  或

ALTERTABLEpoliciesDROPCONSTRAINTchk_gender;
  Check束缚

  在数据列上Check束缚必要一个特别的布尔前提大概将数据列设置成TRUE,最少一个数据列的值是NULL,Check束缚用于加强表中数据内容的复杂的贸易划定规矩。用户利用Check束缚包管数据划定规矩的分歧性。Check束缚能够触及该行同属Check束缚的其他数据列但不克不及触及其他行或其他表,或挪用函数SYSDATE,UID,USER,USERENV。假如用户的贸易划定规矩必要这类的数据反省,那末可使用触发器。Check束缚不回护LOB数据范例的数据列和工具、嵌套表、VARRY、ref等。单一数据列能够有多个Check束缚回护,一个Check束缚能够回护多个数据列。

  创立表的Check束缚利用CREATETABLE语句,变动表的束缚利用ALTERTABLE语句。

  语法:

CONSTRAINTCHECK(condition);
  Check束缚能够被创立或增添为一个表束缚,当Check束缚回护多个数据列时,必需利用表束缚语法。束缚名是可选的而且假如这个名字不存在,那末oracle将发生一个以SYS_入手下手的独一的名字。

  例:

CREATETABLEpolicies
(policy_idNUMBER,
holder_nameVARCHAR2(40),
genderVARCHAR2(1)constraintchk_genderCHECK(genderin(M,F),
marital_statusVARCHAR2(1),
date_of_birthDATE,
constraintchk_maritalCHECK(marital_statusin(S,M,D,W))
);

  NOTNULL束缚

  NOTNULL束缚使用在单一的数据列上,而且他回护的数据列必需要无数据值。缺省情况下,ORACLE同意任何列都能够有NULL值。某些贸易划定规矩请求某数据列必需要有值,NOTNULL束缚将确保该列的一切数据行都有值。

  例:

CREATETABLEpolicies
(policy_idNUMBER,
holder_nameVARCHAR2(40)NOTNULL,
genderVARCHAR2(1),
marital_statusVARCHAR2(1),
date_of_birthDATENOTNULL
);
  关于NOTNULL的ALTERTABLE语句与其他束缚略微有点分歧。

ALTERTABLEpoliciesMODIFYholder_nameNOTNULL
独一性束缚(Uniqueconstraint)

  独一性束缚能够回护表中多个数据列,包管在回护的数据列中任何两行的数据都不不异。独一性束缚与表一同创立,在独一性束缚创立后,可使用ALTERTABLE语句修正。

  语法:

column_namedata_typeCONSTRAINTconstraint_nameUNIQUE
  假如独一性束缚回护多个数据列,那末独一性束缚要作为表束缚增添。语法以下:

CONSTRAINTconstraint_name(column)UNIQUEUSINGINDEXTABLESPACE(tablespace_name)STORAGE(storedclause)
  独一性束缚由一个B-tree索引加强,以是能够在USING子串中为索引利用特别特性,好比表空间或存储参数。CREATETABLE语句在创立独一性束缚的同时也给方针数据列创建了一个独一的索引。

CREATETABLEinsured_autos
(policy_idNUMBERCONSTRAINTpk_policiesPRIMARYKEY,
vinVARCHAR2(10),
coverage_beginDATE,
coverage_termNUMBER,
CONSTRAINunique_autoUNIQUE(policy_id,vin)USINGINDEXTABLESPACEindexSTORAGE(INITIAL1MNEXT10MPCTINCREASE0)
);
  用户能够禁用未以性束缚,但他仍旧存在,禁用独一性束缚利用ALTERTABLE语句

ALTERTABLEinsured_autosDISABLECONSTRAINunique_name;
  删除独一性束缚,利用ALTERTABLE....DROPCONSTRAIN语句

ALTERTABLEinsured_autosDROPCONSTRAINunique_name;
  注重用户不克不及删除在有内部键指向的表的独一性束缚。这类情形下用户必需起首禁用或删除内部键(foreignkey)。

  删除或禁用独一性束缚一般同时删除相干联的独一索引,因此下降了数据库功能。常常删除或禁用独一性束缚有大概招致丧失索引带来的功能毛病。要制止如许毛病,能够接纳上面的步骤:

  1、在独一性束缚回护的数据列上创立非独一性索引。

  2、增加独一性束缚

  主键(PrimaryKey)束缚

  表有独一的主键束缚。表的主键能够回护一个或多个列,主键束缚可与NOTNULL束缚配合感化于每数据列。NOTNULL束缚和独一性束缚的组合将包管主键独一地标识每行。像独一性束缚一样,主键由B-tree索引加强。

  创立主键束缚利用CREATETABLE语句与表一同创立,假如表已创立了,可使用ALTERTABLE语句。

CREATETABLEpolicies
(policy_idNUMBERCONSTRAINTpk_policiesPRIMARYKEY,
holder_nameVARCHAR2(40),
genderVARCHAR2(1),
marital_statusVARCHAR2(1),
date_of_birthDATE
);
  与独一性束缚一样,假如主键束缚回护多个数据列,那末必需作为一个表束缚创立。

CREATETABLEinsured_autos
(policy_idNUMBER,
vinVARCHAR2(40),
coverage_beginDATE,
coverage_termNUMBER,
CONSTRAINTpk_insured_autosPRIMARYKEY(policy_id,vin)
USINGINDEXTABLESPACEindex
STORAGE(INITIAL1MNEXT10MPCTINCREASE0)
);
  禁用或删除主键必需与ALTERTABLE语句一同利用

ALTERTABLEpoliciesDROPPRIMARYKEY;
  或

ALTERTABLEpoliciesDISABLEPRIMARYKEY;
  内部键束缚(Foreignkeyconstraint)

  内部键束缚回护一个或多个数据列,包管每一个数据行的数据包括一个或多个null值,大概在回护的数据列上同时具有主键束缚或独一性束缚。援用(主键或独一性束缚)束缚能够回护统一个表,也能够回护分歧的表。与主键和独一性束缚分歧内部键不会隐式创建一个B-tree索引。在处置内部键时,我们经常利用术语父表(parenttable)和子表(childtable),父表暗示被援用主键或独一性束缚的表,子表暗示援用主键和独一性束缚的表。

  创立内部键利用CREATETABLE语句,假如表已创建了,那末利用ALTERTABLE语句。

CREATETABLEinsured_autos
(policy_idNUMBERCONSTRAINTpolicy_fk
REFERENCEpolicies(policy_id
ONDELETECASCADE,
vinVARCHAR2(40),
coverage_beginDATE,
coverage_termNUMBER,
makeVARCHAR2(30),
modelVARCHAR(30),
yearNUMBER,
CONSTRAINauto_fkFROEIGNKEY(make,model,year)
REFERENCESautomobiles(make,model,year)
ONDELETESETNULL
);

  ONDELETE子串告知ORACLE假如父记录(parentrecord)被删除后,子纪录做甚么。缺省情形下克制在子纪录还存在的情形下删除父记录。

  内部键和NULL值

  在内部键束缚回护的数据列中NULL值的处置大概发生不成意料的了局。ORACLE利用ISOstandarMatchNone划定规矩加强内部键束缚。这个划定规矩划定假如任何内部键感化的数据列包括有一个NULL值,那末任何保存该键的数据列在父表中没有婚配值。

  好比,在父表AUTOMOBILES中,主键感化于数据列MAKE,MODEL,YEAR上,用户利用的表INSURED_AUTOS有一个内部束缚指向AOTOMOBILES,注重在INSURES_AUTOS中有一数据行的MODEL列为NULL值,这一行数据已经由过程束缚反省,即便MAKE列也没有显现在父表AUTOMOBILES中,以下表:

  表1AUTOMOBILES

MAKEMODELYEARFordTaurus2000ToyotaCamry1999
  表2INSURED_AUTOS

POLICY_IDMAKEMODELYEAR576FordTaurus2000577ToyotaCamry1999578TuckerNULL1949
  提早束缚查验(DeferredConstraintChecking)

  束缚查验分两种情形,一种是在每条语句停止后查验数据是不是满意束缚前提,这类查验称为当即束缚查验(immediatelychecking),另外一种是在事件处置完成以后对数据举行查验称之为提早束缚查验。在缺省情形下Oracle束缚查验是当即查验(immediatelychecking),假如不满意束缚将先是一条毛病信息,但用户能够经由过程SETCONSTRAINT语句选择提早束缚查验。语法以下:

SETCONSTRAINTconstraint_name|ALLDEFEERRED|IMMEDIATE--;
序列(Sequences)

  Oracle序列是一个一连的数字天生器。序列经常使用于工资的关头字,或给数据行排序不然数据行是无序的。像束缚一样,序列只存在于数据字典中。序列号能够被设置为上升、下落,能够没无限制或反复利用直到一个限定值。创立序列利用SETSEQUENCE语句。

CREATESEQUENCEsequenceKEYWORD
  KEYWORD包含上面的值:


KEYWORD形貌STARTWITH界说序列天生的第一个数字,缺省为1INCREMENTBY界说序列号是上升仍是下落,关于一个降序的序列INCREMENTBY为负值MINVALUE界说序列能够天生的最小值,这是降序序列中的限定值。缺省情形下该值为NOMINVALUE,NOMINVALUE,关于升序为1,关于降序为-10E26.MAXVALUE序列能天生的最年夜数字。这是升序序列中的限定值,缺省的MAXVALUE为NOMAXVALUE,NOMAXVALUE,关于升序为10E26,关于降序为-1。CYCLE设置序列值在到达限定值今后能够反复NOCYCLE设置序列值在到达限定值今后不克不及反复,这是缺省设置。当试图发生MAXVALUE+1的值时,将会发生一个非常CACHE界说序列值占有的内存块的巨细,缺省值为20NOCACHE在每序次列号发生时强迫数据字典更新,包管在序列值之间没有距离当创立序列时,STARTWITH值必需即是或年夜于MINVALUE。
  删除序列利用DROPSEQUENCE语句

DROPSEQUENCEsequence_name

  索引(INDEXES)

  索引是一种能够进步查询功能的数据布局,在这一部分我们将会商索引怎样进步查询功能的。ORACLE供应了以下几种索引:

  B-Tree、哈希(hash)、位图(bitmap)等索引范例
  基于原始表的索引
  基于函数的索引
  域(Domain)索引

  实践使用中次要是B-Tree索引和位图索引,以是我们将会合会商这两种索引范例。

  B-Tree索引

  B-Tree索引是最一般的索引,缺省前提下创建的索引就是这类范例的索引。B-Tree索引能够是独一或非独一的,能够是单一的(基于一列)或毗连的(多列)。B-Tree索引在检索高基数数据列(高基数数据列是指该列有良多分歧的值)时供应了最好的功能。关于掏出较小的数据B-Tree索引比全表检索供应了更无效的办法。但当反省的局限凌驾表的10%时就不克不及进步取回数据的功能。正如名字所表示的那样,B-Tree索引是基于二元树的,由枝干块(branchblock)和树叶块(leafblock)构成,枝干块包括了索引列(关头字)和另外一索引的地点。树叶块包括了关头字和给表中每一个婚配行的ROWID。

  位图索引

  位图索引次要用于决议撑持体系或静态数据,不撑持行级锁定。位图索引能够是复杂的(单列)也能够是毗连的(多列),但在理论中尽年夜多半是复杂的。位图索引最好用于低到中聚集(cardinality)列,在这些列上多位图索引能够与AND或OR操纵符分离利用。位图索引利用位图作为键值,关于表中的每数据行位图包括了TRUE(1)、FALSE(0)、或NULL值。位图索引的位图寄存在B-Tree布局的页节点中。B-Tree布局使查找位图十分便利和疾速。别的,位图以一种紧缩格局寄存,因而占用的磁盘空间比B-Tree索引要小很多。

  同义词(Synonyms)

  对另外一个数据工具而言同义词是一一般名。public同义词是针对一切用户的,绝对而言private同义词则只针对工具具有者或被授与权限的账户。在当地数据库中同义词能够暗示表、视图、序列、程序、函数或包等数据工具,也能够经由过程链接暗示另外一个数据库的工具。

  创立同义词语法以下:

CREATESYNONYMsynonym_nameFORobject[@db_link];  
  例:

CREATEPUBLICSYNONYMpoliciesFORpoladm.policies@prod;

CREATESYNONYMplan_tableFORsystem.plan_table;
据我的观察,现在有一个趋势,那些经过正式培训的数据库管理员DBA更倾向于选择一个专有关系数据库,例如Oracle。对于一些具有专门数据库管理员的比较大的环境来说,MySQL很难得到宠爱,这时候,关于MySQL是否真的具有良好的可扩展性的争论已经没有意义。

乐观 发表于 2015-1-19 21:50:39

一个是把SQL语句写到客户端,可以使用DataSet进行加工;

精灵巫婆 发表于 2015-1-28 05:51:58

原来公司用过MYSQL自己也只是建个表写个SQL

变相怪杰 发表于 2015-2-5 12:11:35

我们学到了什么?思考问题的时候从表的角度来思考问

冷月葬花魂 发表于 2015-2-11 19:12:04

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

金色的骷髅 发表于 2015-3-2 17:48:48

呵呵,这就是偶想说的

因胸联盟 发表于 2015-3-11 04:54:44

SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.

深爱那片海 发表于 2015-3-25 02:36:47

分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
页: [1]
查看完整版本: MYSQL编程:Oracle数据库的完全性束缚划定规矩