什么是约束呢?(CONSTRAINT–约束)
为了完成数据库数据完整性和一致性的检查机制(约束DML的操作)。
1 非空约束(NOT NULL,NN)
可以保证表中字段的值任何一条记录都不允许为null。
(1)创建表的过程中给字段加非空约束
CREATE TABLE employees(
--简写,系统随机生成约束名
name VARCHAR2(30) NOT NULL,
--自定义约束名(表名_字段名_约束关键字)
hiredate DATE CONSTRAINT employees_hiredate_nn NOT NULL
);
(2)修改表时添加非空约束
ALTER TABLE 表名 MODIFY(字段名 字段类型() NOT NULL);
字段类型可以不写
(3)取消非空约束
3.1 根据表字段进行修改
ALTER TABLE 表名 MODIFY(字段名 字段类型() NULL);
这种方式后面的NULL在不同版本是不可省略的,不建议省略
3.2 根据约束名进行删除
ALTER TABLE 表名 DROP CONSTRAINT 自定义约束名;
2 唯一性约束(UNIQUE,UK)
保证表中字段的值任何一条记录都不允许重复,但是null除外。
(1)创建表的过程中给字段加唯一约束
CREATE TABLE employee (
id NUMBER(6) UNIQUE,--行级定义
name VARCHAR2(30) ,
CONSTRAINT employees1_name_uk UNIQUE(name)--表级定义,写在所有字段名的后面。
);
(2)创建表之后添加唯一性约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名UNIQUE(字段名);
当表中有数据存在,要添加约束的对应字段本身就有重复值,那么这时候就会添加约束不成功,就只能够把数据先清空,或者把重复值给去掉。
3 主键约束(PRIMARY KEY,PK)
相当于非空且唯一,大多数情况下一张表有一个主键,不允许有多个主键,一般情况下一张表第一个字段为主键。
(1)创建表时添加约束
1)系统随机分配约束名
字段名 数据类型 约束关键字,
2)自定义约束名
字段名 数据类型 CONSTRAINT 自定义约束名 约束关键字
3)在所有字段定义完之后加上约束:表级定义
CONSTRAINT 自定义约束名 约束关键字(字段名) (非空除外)
(2)创建表之后再添加约束
ALTER TABLE 表名 MODIFY 字段名 约束关键字;--系统约束名
ALTER TABLE 表名 ADD CONSTRAINT 自定义约束名 约束关键字(定义约束的字段名);
从本意来说应该要用add,但是modify可以用在非空上
(3)删除约束
ALTER TABLE 表名 DROP CONSTRAINT 自定义约束名;
4 检查约束(CHECK,CK)
指定一个条件表达式,让用户在添加数据的时候需要基于一些业务。当符合规则,执行DML(数据操作语句),如果不符合规则,则失败。但检查约束检查NULL值不会报错。
ALTER TABLE 表名 ADD CONSTRAINT 自定义约束名 CHECK(约束条件);
例1:对性别添加一个男或女且非空的约束
ALTER TABLE STUDENT ADD CONSTRAINT CK_S_SEX CHECK(SEX=’男’ or SEX=’女’) AND (SEX IS NOT NULL);
OR—或,两边有一个成立即可 AND–和,两边都要为真
Is 和 = 区别:
is 仅用在is null或is not null
= 用在2种情况下:一是判断值是否相等 where id=1、二是用于赋值set id=1
例2:根据约束名删除检查约束
ALTER TABLE employees DROP CONSTRAINT employees_sex_ck;
例3:给employees:的salary字段加上检查约束,工资必须要高于2000
ALTER TABLE employees2 ADD CONSTRAINT employees2_sal_ck CHECK(salary>2000);
5 外键约束(FOREIGN KEY,FK)
用来强制约束两个表的关系,该约束要求定义约束的字段中的每个值必须要与另外一个表中字段值相匹配。
外键(子级):引用其他表中主键的列
引用键(父级):被外键引用的表中的主键或者唯一键
(1)添加外键约束
ALTER TABLE 含外键的表名 ADD CONSTRAINT 自定义的外键约束名 FOREIGN KEY (定义的外键约束字段名) REFERENCES 含主键的表名 (定义的主键约束字段名);
粗略的理解就是外键的值要是另外一张表中主键的值其中之一。
两者是相互制约的关系:
简单来说:外键引用主键。要先有主键,对主键所在的表添加数据后,在对外键所对应的表添加数据。stu-class是外键,添加数据时其外键stu-class对应的值必须是主键class id其中的一个字段值,否则就添加不成功。
在进行删除某个含有主键(父级)值的数据操作时,如果子级(外键)没有引用主键值则可以删除成功。假如其子级已经引用过父级添加数据之后,此时在对删除含有主键的数据时就会失败。
(2) 级联关系
1)ON DELETE SET NULL 删除时设置为空
删除主键数据时把其对应的外键的数据设置为空。
ALTER TABLE (含外键的)表名ADD CONSTRAINT 自定义的外键约束名 FOREIGN KEY(定义的外键约束字段名) REFERENCES 主键名 (定义的主键约束字段名) ON DELETE SET NULL;
SET;是SQL语句中对已经定义的变量赋值的方式
ON DELETE CASCADE:删除父表数据时顺带把子表对应数据删除
ALTER TABLE (含外键的)表名ADD CONSTRAINT 自定义的外键约束名 FOREIGN KEY(定义的外键约束字段名) REFERENCES 主键名 (定义的主键约束字段名) ON DELETE CASCADE;
级联关系约束与外键约束是并列的关系,相互独立存在。