ORACLE —约束
定义:
约束(CONSTRAINT)就是强加在表中的规则或者条件
作用:
让表中数据更加符合实际需要,如果录入不符合规则的数据,拒绝录入
注:EMP表中EMPNO字段和DEPTNO字段上DML操作时遇到的限制即是约束。
分类
按照约束效果的不同分为以下五种(括号内为命名前缀)
1.唯一约束(UN_)
字段中不能
出现重复的非空
数据
2.非空约束(NN_)
字段中不
能出现空值
3.主键约束(PK_)
字段中既不能出现空值,又不能出现重复值
4.检查约束(CK_)
自定义约束内容(类似于WHERE中的条件)
5.外键约束(FK_)
字段的取值范围取决于另一张表的某字段
根据约束建立时是否随同字段一同声明分为行级约束与表级约束
行级约束:
声明字段名与字段属性的同时,紧随其后直接声明约束
(在建表时)
表级约束:
所有的字段与字段属性声明结束后,再单独声明
约束
唯一约束
已经建完表后建立约束的语法:
ALTER TABLE TB_NAME ADD CONSTRAINT CONSTR_NAME UNIQUE(COL_NAME);
建表的同时,将约束一并建立的语法
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE UNIQUE, --行级约束 (系统自动分配约束名称)
COL_NAME2 COL_ TYPE,
...
COL_NAMEN COL_ TYPE );
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE CONSTRAINT CONSTR_NAME UNIQUE,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE );
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE,
CONSTRAINT CONSTR_NAME UNIQUE(COL_NAME1) );
tips:
1.若是唯一约束建立在多个字段上,以这些字段内容的组合是否重复来作为是否违反唯一约束的标准
2.建立了唯一约束的字段上会自动建立一个唯一索引
3.唯一约束针对的是非空数据,即允许有多个空值存在
非空约束
在已经建好表的基础上建立或取消非空约束
ALTER TABLE TB_NAME MODIFY COL_NAME NOT NULL; --不允许为空
ALTER TABLE TB_NAME MODIFY COL_NAME NULL; --允许为空
在建表的同时建立约束
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE NOT NULL,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE);
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE CONSTRAINT CONSTR_NAME NOT NULL,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE);
tips:
非空约束的建立语法中只有行级约束,没有表级约束
主键约束
1建表后建立约束
ALTER TABLE TB_NAME ADD CONSTRAINT CONSTR_NAME PRIMARY KEY (COL_NAME);
2建表时建立约束
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE PRIMARY KEY, --行及约束
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE);
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE CONSTRAINT CONSTR_NAME PRIMARY KEY,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE);
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE,
CONSTRAINT CONSTR_NAME PRIMARY KEY (COL_NAME) );
tips:
1.一个表中只能存在一个主键约束
2.建立了主键约束的字段,会自动建立一个唯一索引
检查约束
1建表后设立检查约束
ALTER TABLE TB_NAME ADD CONSTRAINT CONSTR_NAME CHECK (CONDITION);
2建表时设立检查约束
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE CHECK(CONDITION),
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE );
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE CONSTRAINT CONSTR_NAME CHECK (CONDITION), --行级约束
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE );
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE,
CONSTRAINT CONSTR_NAME CHECK (CONDITION) );
tips:
1.条件中不允许写子查询
2.行级约束只能针对当前的列,不能引用其他列的检查条件,表级约束没有此限制
3.检查约束针对的是非空值,即空值不受检查约束限制
外键约束
1建表后添加外键约束
ALTER TABLE TB_NAME ADD CONSTRAINT CONSTR_NAME FOREIGN KEY (COL_NAME) REFERENCES MAIN_TB_NAME(PK_COL_NAME OR UN_COL_NAME);
2建表时添加外键约束
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE REFERENCES MAIN_TB_NAME (PK_COL_NAME OR UN_COL_NAME),
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE);
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE CONSTRAINT CONSTR_NAME REFERENCES MAIN_TB_NAME (PK_COL_NAME OR UN_COL_NAME),
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE );
CREATE TABLE TB_NAME (
COL_NAME1 COL_TYPE,
COL_NAME2 COL_TYPE,
...
COL_NAMEN COL_TYPE,
CONSTRAINT CONSTR_NAME FOREIGN KEY (COL_NAME) REFERENCES MAIN_TB_NAME (PK_COL_NAME OR UN_COL_NAME) );
tips:
1.以当前表作为子表,用来获取取值范围的另一张表作为主表来说,外键约束是建立在子表上的,而非主表
2.外键针对的是非空值,即空值不受外键约束限制
3.想要在子表上建立外键约束指向主表的字段,主表上被指定的字段必须是建立过主键约束或唯一约束
4.子表中若存在主表中不存在的数据,则试图建立外键时会失败
5.子表中想要插入或修改数据,处理后的数据必须存在于主表中,否则会处理失败
6.主表中已存在于子表中的内容,想要删除或修改时必须先删除或修改对应的子表内容,否则会处理失败
小结:
1.同一用户下不能出现重复的约束名
2.表删除时,该表下的所有约束也会一并删除
3.若表中某字段上已存在违反约束的数据,则约束不能顺利建立
4.约束可以在表建完后再单独建立
5.一个约束可以建在一个字段上,也可建立在多个字段上
删除约束
通用语法:
ALTER TABLE TB_NAME DROP CONSTRAINT CONSTR_NAME;
非空约束自己独特的删除方式
ALTER TABLE TB_NAME MODIFY COL_NAME NULL;
重命名约束
ALTER TABLE TB_NAME RENAME CONSTRAINT OLD_NAME TO NEW_NAME;
激活与禁用
–禁用的语法
ALTER TABLE TB_NAME DISABLE CONSTRAINT CONSTR_NAME;
–激活的语法
ALTER TABLE TB_NAME ENABLE CONSTRAINT CONSTR_NAME;
总结:
1.因为约束的存在,数据库进行DML操作时会额外花费时间用来做数据的验证,且约束不能为查询带来效率上的提升,所以约束的地位渐渐被代码验证的方式所取代。
2.使用CREATE TABLE TB_NAME AS SELECT …语法建立一张表时,除了非空,其他的约束都会被忽视。