约束
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
- not null 非空约束
- unique 唯一约束
- primary key 主键约束
- Foreing key 外键约束
- check 检查约束
- DEFAULT - 规定没有给列赋值时的默认值。
1、表级约束和列级约束
作用范围:
- 列级约束只作用在一个列上
- 表级约束可以作用在多个列上
定义的方式:
-
列级约束必须跟在列的后面进行定义
-
表级约束不与列一起 单独定义
-
非空约束只能定义在列上
2、约束的定义
1 . 非空约束(not null)
保证列值不能为空 只能定义在列上
-- 添加非空约束
sname varchar2(30) not null,--给列添加非空约束 此时该列不允许插入空值
ALTER TABLE Persons MODIFY Age int NOT NULL;-- 表已创建好时使用
非空约束也属于检查约束的一种
可以自定义约束的名称 如果自己不定义 则系统自动生成 (sys_数字+字母)
2 . 唯一约束(unique)
唯一约束 表示盖子字段的值 不能重复
唯一约束 允许出现null值 而且多个null值不违反唯一约束(null 和 null 是不一样的)
1)定义列约束:[Constrain <约束名>] Unique
2)定义表约束:Constrain <约束名> Unique ( <列名> [{<列名>}])
email varchar2(100) unique,--唯一约束
phone varchar2(11) constraint stu_phone_unique unique,
3 . 主键约束(primary key)
- 等于 唯一约束 + 非空约束
- 主键约束既可以定义在列上 也可以定义为表级约束
- 每个表都应该有一个主键,并且每个表只能有一个主键。
- 一般在表设计中 都会选取一个无意义列或者唯一列作为主键,但是也可以选取多个列作为联合主键
1)定义列约束:Constraint <约束名> Primary Key
2)定义表约束:[Constraint <约束名>] Primary Key( <列名> [{<列名>}])
constraint pk_sid_sname PRIMARY KEY(sid)
constraint pk_sid_sname PRIMARY KEY(sid,sname) --联合主键 不推荐使用
4 . 列级约束
主要作用就是来给多张表添加关联的
FOREIGN KEY 外键的关键字,REFERENCES 表示关联的外键字段
constraint fk_stu_cls foreign key(cid) references classes(cid)--外键
-- 外键字段引用的值,必须是父表中存在的记录
删除和修改
- 如果删 父表中的数据 该记录没有关联的子表记录 则可以直接删除
- 如果有关联的子表记录 则不能直接删除父表的记录
- 设置父表记录删除时 所关联的子表的修改方式
- on delete cascade 表示级联删除 删除父表的时候 将关联到它的从表的记录全部删除
- on delete set null 级联更新
当删除父表的时候 从表关联的数据记录 设置为null 或者为一个新值 都可以
5 . 检查约束(check)
每一行必须满足的条件
sage number(2) check (sage > 18 and sage < 60),--检查约束 系统命名
constraint ck_sage check (sage > 18 and sage < 60),
3、修改约束
- 添加和删除约束 但是不能修改已有的约束
- 有效化或无效化约束
- 添加not null 约束时候要使用modify
--从表
create table student(
sid number(6) ,
sname varchar2(30) ,
sage number(2) ,
email varchar2(100),
phone varchar2(11),
hiredate DATE ,
cid number(6)
)
--父表
create table classes(
cid number(6) primary key,
cname varchar2(20)
)
--添加外键约束
alter table student add constraint fk_stu_cls foreign key(cid) references classes(cid) on delete cascade;
alter table student MODIFY( sname varchar2(30) not null);--非空约束 SYS_C007587
-- 删除约束
alter table student drop constraint SYS_C007587;
--无效化约束
alter table student disable constraint SYS_C007588;
-- 激活约束
alter table student enable constraint SYS_C007588;