Oracle的约束详解

约束:///就是强加在表中的规则或者条件,作用让表中的数据更加符合实际要求

constraint

 

约束的分类

一、按照约束的效果不同分为六种

1.唯一约束

unique

作用:字段中不能出现重复的非空数据,,,///不能添加两个张三但无法限制空值

2.非空约束

not null

作用:该字段中不能出现空值

3.主键约束 

primary key

作用:该字段中不能出现空值,也不能出现重复值

4.外键约束

foreign key

作用:字段的取值范围来自另一张表的某字段(某字段表示另一张表主键)

5.检查约束

check

作用:自定义约束内容(类似于where条件)

6.默认值 

default

作用:字段中没有插入数据时默认填入的值

 

 

二、按照建立时是否跟字段一同声明分两种

1.行级约束

///声明字段与字段属性的同时紧跟其后声明约束

例子:create table 表名(列名1 字段属性 约束,列名2 字段属性)

2.表级约束

声明字段与字段属性之后,再单独声明约束

create table 表名(列名1 字段属性,列名2 字段属性。。。,声明约束)

注意:

1.同一用户下约束不能重名

2.表删除时,该表的所有约束也会一并删除

3.若表中某字段已经存在了违反约束的数据,则建立约束会失败

4.约束可以在健完表之后再单独建立

5.一个约束可以建立在某一字段上也可以建立在多个字段上

6.唯一约束约束不了空值

7.建立了唯一约束会建立一个同名的唯一索引

创建约束

 

 

1.唯一约束unique

a.建立完表之后建立唯一约束

1.行级约束

语法:

alter table 表名 add constraint 约束名 unique (列名。。。。(///作用在哪一个列上))

例子

alter table student add constraint UN_student_sname unique(sanme) 

---已经存在两个程梅失败

b.建表的同时建立唯一约束

create table 表名 (列名1 字段属性 unique ,列名2 字段属性 ,列名3 字段属性。。。)

///系统会自动取约束名

自己取名

create table 表名 (列名1 字段属性 constraint 约束名 unique ,列名2 字段属性 ,列名3 字段属性。。。)

2.表级约束

语法:

create table 表名(列名1 字段属性,列名2 字段属性,。。。。

列名n 字段属性,constraint 约束名 unique(列名。。。))

 

 

 

2.非空约束

not null

1.建完表之后建立非空约束

语法

alter table 表名 modify 列名 not null

2.建表的同时建立非空约束

a.行级约束

语法1:

create table 表名 (列名1 字段属性 not null,字段2 字段属性,。。。。。)///约束没有名字

语法2:

create table 表名 (列名1 字段属性 constraint 约束名 not null ,列名2 字段属性。。。)

///自己取了名字但展示在了check中,相当于检查约束

b.表级约束

非空约束没有表级约束

 

3.主键约束//不能为空也不能重复

a.建完表之后建立

语法:

alter table 表名 add constraint 约束名 primary key (列名)

b.建完表之后建立主键约束

1.行级约束

create table 表名 (列名1 字段属性 primary key,列名2 字段属性)///系统自动取名

语法2.

create table 表名(列名1 字段属性 constraint pk_zy_zno primary key,列名2 字段属性)

///自己取名

2.表级约束

create table 表名

(列名1 字段属性,列名2 字段属性,constraint 约束名 primary key (列名))

注意:

1.一张表只能有一个主键约束

2.建立了主键约束会建立一个同名的唯一索引

 

4.外键约束 //外键约束不了空值,主键没有空值外键可以插入空值,想要删除父表中的主键列

必须先删除子表中的外键数据

foreign key

a.建立完表建立外键约束

语法:

alter table 表名 add constraint 约束名 foreign key(列名)

references 父表名(必须是主键列或者唯一列)

 

b.建表同时建立外键约束

(1)行级约束

语法:

create table 表名(列名1 字段属性 references 父表名 (必须是主键列或者唯一列),

列名2 字段属性。。。。)

 

语法2 

create table 表名(列名1 字段属性

constraint 约束名 references 父表名(必须是主键列或者唯一列),列名2 字段属性,。。。)

 

(2)表级约束

语法:

create table 表名(列名1 字段属性,列名2 字段属性 , 。。。。,

constraint 约束名 foreign key (列名) references 父表名(必须是主键列或者唯一列))

注意:

1.外键约束不了空值

2.要想删除父表的主键数据必须先删除子表的外键数据

3.想要修改外键数据,修改后必须在主键数据里

4.外键约束之所以有这么顽固的限制,很少在项目中使用,甚至禁止

 

 

5.检查约束

check

a.建表之后建立检查约束

语法:

alter table 表名 add constraint 约束名 check(条件)

/条件 和where后面一样

例子

alter table zhiyun47 add constraint CH_zhiyun47_zname check (zname='杨雪')

b.建表同时建立检查约束

1.行级约束

语法

create table 表名(列名1 字段属性 check(条件),列名2 字段属性,。。。。。)

语法2

create table 表名(列名1 字段属性 constraint 约束名 check (条件),列名2 字段属性。。。)

 

2.表级约束

语法

create table 表名(列名1 字段属性,列名2 。。。,constraint 约束名 check (条件))

注意:

1.行级约束条件中只能针对当前列,不能引用其他列

2.条件中不允许写子查询

3.检查约束不能约束空值

 

 

6.默认值 default

a.创建完表创建默认值

语法:

alter table 表名 modify 列名 default 值

 

alter table emp modify job default '扫地'

 

 

b.创建表的同时创建默认值

creat table 表名(列名1 字段属性 default 值,列名2 字段属性。。。。)没有表级约束

 

约束的删除

1.通用语法

alter table 表名 drop constraint 约束名

2.非空约束删除语法

alter table 表名 modify 列名 null

3.默认值删除

alter table 表名 modify 列名 default 新值/// 不想让其没有数可以为null

约束注意:;

1.因为约束的存在,数据库会花大量的时间去做数据验证,所以会降低dml执行操作效率

所以不是越多越好

2.使用快捷建表复制出来的表除了非空约束其他约束都会被忽略

--禁用

Alter table 表名 disable constraint约束名 ;

--激活

Alter table 表名 enable constraint约束名 ;

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值