1、 一、 数据库约束的作用和分类primarykey 和 unique 他们的作用是为了不让表中有重复的数据(一个表)check 表示表中列的数据的范围性的定义(一个表)defult 表示表中的默认值foreignkey 表与表之间的联系(两个或两个以上的表)【unique 是可以包含 null 值的,并且一个表中可以有多个 unique constraint而 primarykey 在一个表中只能有一个 .并且不能有 null 值】二、针对约束创建有两种不同的思想第一、创建标的时候一同将约束创建了第二、你的表已经创建好了,向表中添加约束三、下面我就一一的介绍他们一、 primary key 主
2、键约束两种写法 在已经创建的表中添加约束解释:添加约束的时候一定要修改表故用(alter修改 )Alter table table1Add primary key (列名1,列名2) 同表一起创建Create table table1(列名1 数据类型 是否为空 primary key ,列名1 数据类型 是否为空)上面的是两种情景为一个字段设置主键,接下来是以多个列作为主键。Create table table1(列名1 数据类型 是否为空,列名2 数据类型 是否为空,列名3 数据类型 是否为空,Primary key (列名1 ,列名2)二、Check 约束这个和主键约束差不多Alter
3、table table1Add unique(列名)三、外键约束好多的同学一直也都不理解外键约束,到底什么才是外键?主键在那个表上?外键在那个表上?用 T-SQL 语句写的时候是主表在前,还是外间表在前?等等一系列的问题!接下来我讲给大家说说这个主外键到底怎么弄的。其实,主外键之间正如它的名字一样,他们之间有一个主从关系,一个主表,一个从表,主表上面设置的是主键,从表上面设置的是外键(foreign key) ,主键表中的数据发生变化的时,外键(foreign key)表的数据立刻就发生改变。向已有的表中添加一个主键(没有就是添加,添加就是修改表)Alter table table1Add f
4、oreign key (列名1)references table2(列名2) 创建表的时候一同创建外键Create table table1(列名4 数据类型 是否为空 primary key,列名3 数据类型 是否为空,列名1 数据类型 references table2 (列名 2)注:Table1外键表Table2主键表列名1是主表列列名2是外键表列最一般常用的是主表的列和外键表的列的字段是一样的一般多为 ID 可以作为主键的。这是两个之间的交互。四、Check 约束他也是基于一个表中的约束,限定表中列直接爱你数据的参照关系。 向一个以创建的表中添加约束Alter tabel table
5、1Add constraint 约束名 check(列名对于列的限制条件)多是一些可以找到范围的数据,例如年龄,身高,体重。五、default 默认约束他是一个对于某一个值的约束,他是唯一的一个用 for 关联词的句子向表中添加一个默认约束Alter tabletable1Add default 默认值for 列名 六、删除约束删除约束也是对于表的修改故:Alter table table1Drop constraint 约束名注:上面就是我所理解的一些约束。想要记住他们并不难1 开头的一般都是 alter table 表名 或是 create table 表名2 在已有的表中添加约束用 al
6、ter3 与表同时创建用 create4 他们所有的关键字:主键 约束:primary key唯一性约束:unique外键 约束:froeign key.references(参照).两个表之间的关系,该是互相参照查询 约束:. constraint(约束).check对字段查询,对字段约束默认 约束:.default.for (给) . 将前面默认的值 给 后边的字段ORACLE 约 束 总 结2012-05-13 08:36 by 潇湘隐者, 682 visits, 收藏, 编辑你对 ORACLE 约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束
7、掌握得比较好了,不用看这篇文章了。ORACLE 的约束有啥功能作用? 有哪些类型约束(不同版本 ORACLE 是否不同)?视图有约束吗?约束是否会影响 SQL 性能? 约束信息存储在哪些系统视图、数据字典中?约束能否修改名称?能否禁用约束?延迟约束有啥好处.约束定义约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行 DML 或 DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACE 系统将为该约束自动生成一个名字,其格式为 SYS_Cn,其中 n
8、为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称。).约束功能约束的功能:实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。约束分类约束分为 6 类: 非空(NOT NULL)约束、 唯一(UNIQUE)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束、条件(CHECK)约束、REF 约束。非空(NOT NULL)约束:顾名思义,所约束的列不能为 NULL 值。否则就会报错 唯一(UNIQUE)约束:在表中每一行中所定义的这列或这些列的值都不能相同。必须保证唯一性。否则就会违法
9、约束条件。主键(PRIMARY KEY)约束:唯一的标识表中的每一行,不能重复,不能为空。 创建主键或唯一约束后,ORACLE 会自动创建一个与约束同名的索引(UNIQUENES 为 UNIQUE 唯一索引)。需要注意的是:每个表只能有且有一个主键约束。外键(FOREIGN KEY)约束:用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等 SQL 性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。例如在数据仓
10、库中,就推荐禁用外键约束。条件(CHECK)约束:表中每行都要满足该约束条件。条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束。REF 约束的定义:REF column by definition references an object in another object type or in a relational table. A REF constraint lets you further describe the relationship between the REF column and the object it references.ORAC
11、LE 11 数据库的约束类型如下:ORACLE 10 数据库的约束类型如下:在 oracle 官方文档 http:/ (check constraint on a table)P (primary key)U (unique key)R (referential integrity)V (with check option, on a view)O (with read only, on a view)http:/ Check constraint on a tableP Primary keyU Unique keyR Referential integrityV With check op
12、tion, on a viewO With read only, on a viewH Hash expressionF Constraint that involves a REF columnS Supplemental logging对于 H、S 类型,尚不清楚情况,而且从上面我在 11g 数据库实验结果看,也没发现这两种类型。(有了解的朋友可以告知一二)约束命名规范约束名称建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。非空约束 NN_表名_列名 唯一约束 UK_表名_列名主键约束 PK_表名外键约束 FK_表名_列名条件约束 CK_表名_列名默
13、认约束 DF_表名_列名如果约束名称超过 32 位长度,建议应该缩写表名,而不应用 NN_表名_数字。不过具体视情况而定,很多时候 DF_表名_列名 这样命名,往往超出了 32 字符。所以有时候需要缩写表面或是采用其它规则。约束操作约束管理创建各类约束先看一下如何创建主键约束CREATE TABLE “DM“.“DEPT“ ( “DEPTNO“ NUMBER(2,0) PRIMARY KEY, “DNAME“ VARCHAR2(14), “LOC“ VARCHAR2(13) ) TABLESPACE “TBS_DM_DAT“ ;COMMENT ON TABLE “DM“.“DEPT“ IS 部
14、门表; COMMENT ON COLUMN “DM“.“DEPT“.“DEPTNO“ IS 部门编号; COMMENT ON COLUMN “DM“.“DEPT“.“DNAME“ IS 部门名称; COMMENT ON CLOUMN “DM“.“DEPT“.“LOC“ IS 部门所在地方;此时它的约束名称是系统创建的。如图所示:如果我们以下面的脚本创建,此时约束如下所示1 CREATE TABLE “DM“.“DEPT“ 2 ( 3 “DEPTNO“ NUMBER(2,0) , 4 “DNAME“ VARCHAR2(14) , 5 “LOC“ VARCHAR2(13) , 6 CONSTRAI
15、NT “PK_DEPT“ PRIMARY KEY (“DEPTNO“) USING INDEX TABLESPACE TBS_DM_IN7 ) TABLESPACE “TBS_DM_DAT“ ;8 9 10 11 12 COMMENT ON TABLE “DM“.“DEPT“ IS 部门表;13 14 COMMENT ON COLUMN “DM“.“DEPT“.“DEPTNO“ IS 部门编号;15 16 COMMENT ON COLUMN “DM“.“DEPT“.“DNAME“ IS 部门名称;17 18 COMMENT ON CLOUMN “DM“.“DEPT“.“LOC“ IS 部门所在
16、地方;19 如果一个表的约束类型比较多,你会看到一堆 SYS_CN 这样的约束,如果不仔细核对后面的字段,很难一眼看出约束类型、约束对应字段。主键约束的限制文档原文如下: (翻译在下) Restrictions on Primary Key Constraints Primary constraints are subject to the following restrictions:A table or view can have only one primary key.一个表或视图有且只有一个主键None of the columns in the primary key can be
17、 LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the primary key can contain a column of TIMESTAMP WITH LOCAL TIME ZONE.主键字段不能为 LOB、LOG、LOG RAW、VARRAY、NESTED TABLE、BFILE、REF、TIMESTAMP WITH TIME ZONE 或用户定义类型。然而它可以包含 TIMESTAMP WITH LOCAL
18、TIME ZONE 类型的字段。The size of the primary key cannot exceed approximately one database block.主键大小不能超过一个数据块大小。A composite primary key cannot have more than 32 columns.主键组合键不能超过 32 列。You cannot designate the same column or combination of columns as both a primary key and a unique key.你不能指定一列或组合列既是主键又是唯一
19、键。You cannot specify a primary key when creating a subview in an inheritance hierarchy. The primary key can be specified only for the top-level (root) view.创建一个继承层次结构中的子视图时,你不能指定一个主键。主键可以唯一指定的顶层(根)视图。外键约束ALTER TABLE childTableADD CONSTRAINT FK_xxxx_xxxFOREIGH KEY(columnName)REFERENCES parentTalbe(pr
20、imaryKeyColumn) ON DELETE CASCADE|SET NULL;ON DELETE SET NULL 子句:当主表中的一行数据被删除时,Oracle 系统会自动地将所有从表中依赖于它的数据记录的外键改成空值;ON DELETE CASCADE:当主表中的一行数据被删除时,Oracle 系统会自动地将所有从表中依赖于它的数据记录删除;注:如果在外键定义中使用了 ON DELETE SET NULL 或 ON DELETE CASCADE,无论删除操作是在父表这一端还是子表这一端都不会产生违反引用完整性的问题,但是却留下了安全隐患。这两个子句要谨慎使用,只有在不得已时使用,谨
21、记谨记!外键约束对 DML 与 DDL 的影响:INSERT:只有操作是在子表或从表这一端时才会产生违反引用完整性约束的问题,父表则不然。DELETE:只有操作是在父表或主表这一端时才会产生违反引用完整性约束的问题,子表则不然。UPDATE:子表父表直接操作都会违反引用完整性约束。两种解决方法:1)先更新子表的引用列为空,再更新父表的主键的列的值,然后把子表的引用列更新成新的父表的值;2)使用 ON DELETE SET NULL,先更新父表,然后将子表外键为空的记录更新为新的值。DDL 语句:DROP TABLE 与 TRUNCATE TABLE,操作父表,违反引用完整性约束,子表则不然。外
22、键约束的限制:Restrictions on Foreign Key Constraints Foreign key constraints are subject to the following restrictions:None of the columns in the foreign key can be of LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the primary key can contai
23、n a column of TIMESTAMP WITH LOCAL TIME ZONE.外键字段不能为 LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type 类型,主键可以包含数据类型为 TIMESTAMP WITH LOCAL TIME ZONE 的字段。The referenced unique or primary key constraint on the parent table or view must already be def
24、ined.引用唯一或主键约束,必须是父表中已经定义的。A composite foreign key cannot have more than 32 columns.外键的组合列不能超过 32 列。The child and parent tables must be on the same database. To enable referential integrity constraints across nodes of a distributed database, you must use database triggers. See CREATE TRIGGER.字表和父表必须
25、在同一个数据库。分布式数据库中,外键不能跨节点,但触发器可以If either the child or parent object is a view, then the constraint is subject to all restrictions on view constraints. See “View Constraints“.You cannot define a foreign key constraint in a CREATE TABLE statement that contains an AS subquery clause. Instead, you must create the table without the constraint and then add it later with an ALTER TABLE statement.你不能在 CREATE TABLE 语句中包含 AS 子查询子句定义一个外键约束。相反,你必须创建一个没有约束的表,然后添加 ALTER TABLE 语句。加上一些类似其它约束的限制条件约束非空约束非空约束的限制:1: 你不能在视图约束上指定字段为 NULL 或 NOT NULL 值2: 你不能指定一个对象的属性为 NULL 或 NOT NULL。相反,而应使用的 IS NOT NULL 条件 CHECK 约束