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约束名 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值