一、约束的定义
约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。
二、约束的功能
实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。
三、约束的分类
1、主键约束
定义:唯一的标识表中的每一行,不能重复,不能为空。 创建主键或唯一约束后,数据库会自动创建一个与约束同名的索引(UNIQUENES为UNIQUE唯一索引)。需要注意的是:每个表只能有且有一个主键约束。
命名规则:PK_表名
限制:一个表或视图有且只有一个主键;主键大小不能超过一个数据块大小;主键组合键不能超过32列;不能指定一列或组合列既是主键又是唯一键;创建一个继承层次结构中的子视图时,不能指定一个主键。主键可以唯一指定的顶层(根)视图。
(1)单字段主键
在定义列的同时指定主键,语法规则:字段名 数据类型 Primary Key [默认值]
(2)多字段联合主键
主键由多个字段联合组成。语法规则:Primary Key[字段1,字段2,....,字段n]
2、外键约束
定义:用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。
主表(父表):对于两个具有关联关系的表而言,相关联字段中的主键所在的那个表即是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中的外键所在的那个表即是从表。
命名规则:FK_表名_列名
限制:引用唯一或主键约束,必须是父表中已经定义的;外键的组合列不能超过32列;字表和父表必须在同一个数据库,分布式数据库中,外键不能跨节点,但触发器可以;不能在CREATE TABLE语句中包含AS子查询子句定义一个外键约束,相反,你必须创建一个没有约束的表,然后添加ALTER TABLE语句;
3、唯一约束
定义:在表中每一行中所定义的这列或这些列的值都不能相同。必须保证唯一性。否则就会违法约束条件。
命名规则:UK_表名_列名
限制:不能在视图约束上指定字段为NULL或NOT NULL值;不能指定一个对象的属性为NULL或NOT NULL,相反,而应使用的IS [NOT] NULL条件CHECK约束。
4、非空约束
定义:约束的列不能为NULL值。否则就会报错
命名规则:NN_表名_列名
限制:组合字段定义的唯一索引,字段个数不能超过32个;不能指定同一字段或组合字段即为主键又是唯一键
5、条件约束
定义:表中每行都要满足该约束条件。条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束。
命名规则:CK_表名_列名
限制:条件约束中的条件与查询语句中的条件相同,但是不包括CURRVAL,NETXTVAL,LEVEL和ROWNUM这样的伪列(PSEUDOCOLUMNS),还不能引用其它行中值的查询语句,不可以调用SYSDATE,USER,USERENV和UID的函数。
四、约束的操作
1,添加约束
(1)添加非空约束
ALTER TABLE tables
MODIFY(MGR CONSTRAINT 约束名 NOT NULL);
(2)添加其他约束
ALTER TABLE tables CONSTRAINT 约束名(条件);
2,删除约束
ALTER TABLE tables CONSTRAINT 约束名;
3,重命名约束
ALTER TABLE tables
RENAME CONSTRAINT 约束名 TO 新约束名;
4,禁用约束
ALTER TABLE 表 DISABLE CONSTRAINT 约束名 [CASCADE];
ALTER TABLE 表 DISABLE PRIMARY KEY CASCADE; -- CASCADE子句用来关闭存在有完整性关系的约束
5,启用约束
使用ENABLE不会将主键约束与外键约束同时打开,只能对主键约束与外键约束分别使用ENABLE CONSTRAINT 子句打开
ALTER TABLE 表 ENABLECONSTRAINT 约束名 [CASCADE];