ORACLE ---约束

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 …语法建立一张表时,除了非空,其他的约束都会被忽视。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值