约束(CONSTRAINT)
-
全称是约束条件,也称作完整性约束条件
-
约束是在数据表上强行执行的一些数据校验规则,如果存在违反规则的数据行为,行为会被约束终止
-
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)
-
添加约束的完整语法:字段 CONSTRAINT 约束名 约束类型
-
也可以使用简写:字段 约束类型
-
完整语法因为有约束名,管理起来很方便,如果使用简写,数据库会自动生成一个名字,存入约束相关的数据字典中
-
-
约束类型有:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT
-
如果约束是在建表后添加,那么若表中已有数据不满足要设置约束条件,则无法添加
NOT NULL(非空约束)
-
简称NN,指示某列不能存储 NULL 值
-
NOT NULL 约束强制列不接受 NULL 值
-
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录
使用 NOT NULL
-
创建表时添加该约束:
CREATE TABLE person(
id NUMBER(4) NOT NULL,
name VARCHAR(30) NOT NULL,
gender CHAR(1) CONSTRAINT person_fn_nn NOT NULL,
age NUMBER(10)
); -
建表后添加该约束:
ALTER TABLE person MODIFY(age NUMBER(10) NOT NULL);
-
撤销该约束:
ALTER TABLE person MODIFY(age NUMBER(10) NULL,gender CHAR(1) NULL);
ALTER TABLE person DROP CONSTRAINT person_fn_nn;
UNIQUE(唯一性约束)
- 简称UK,该约束用于保证单个字段或者多个字段的组合不出现重复值,但允许重复值是NULL值
使用 UNIQUE
-
建表时添加:
CREATE TABLE person(
id NUMBER(4) UNIQUE,
name VARCHAR(30) CONSTRAINT person_uk1 UNIQUE,
gender CHAR(1),
age NUMBER(10),
height NUMBER(10),
weight NUMBER(10),
city VARCHAR(20),
UNIQUE(gender),
CONSTRAINT person_uk2 UNIQUE(age)
); -
建表后添加:
ALTER TABLE person ADD UNIQUE(height);
ALTER TABLE person ADD CONSTRAINT person_uk3 UNIQUE(city);
ALTER TABLE person MODIFY(weigjt NUMBER(10) UNIQUE);
-
撤销约束:
ALTER TABLE person DROP CONSTRAINT person_uk;
PRIMARY KEY(主键约束)
-
简称PK,是NOT NULL 和 UNIQUE 的结合,确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录
-
PRIMARY KEY约束唯一标识数据库表中的每条记录。
-
主键列必须包含唯一的值,主键列不能包含NULL值。
-
每个表都应该有一个主键,并且每个表只能有一个主键
使用 PRIMARY KEY
-
建表时添加:
CREATE TABLE person(
id NUMBER(4) PRIMARY KEY,
name VARCHAR(30),
gender CHAR(1),
age NUMBER(10)
);CREATE TABLE person(
id NUMBER(4),
name VARCHAR(30),
gender CHAR(1),
age NUMBER(10),
PRIMARY KEY(id)
);CREATE TABLE person(
id NUMBER(4),
name VARCHAR(30),
gender CHAR(1),
age NUMBER(10),
CONSTRAINT person_pk1 PRIMARY KEY(id)
); -
建表后添加:
ALTER TABLE person ADD PRIMARY KEY(id);
ALTER TABLE person ADD CONSTRAINT person_pk1 PRIMARY KEY(id);
ALTER TABLE person MODIFY(id NUMBER(4) PRIMARY KEY);
-
撤销约束:
ALTER TABLE person DROP PRIMARY KEY;
ALTER TABLE person DROP CONSTRAINT person_uk1;
FOREIGN KEY(外键约束)
-
简称FK,外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证两个字段的关系
-
外键约束对性能的降低:
-
如果在一个频繁的DML操作的表上建立外键,每次DML操作,都将导致数据库自动对外键所关联的对应表做检查,很浪费资源
-
外键确定了主从表的先后生成关系,有时会影响业务逻辑
-
-
关联不一定需要外键约束
使用 FOREIGN KEY
-
建表时添加:
CREATE TABLE orders(
o_id NUMBER(4 ),
orderno NUMBER(4),
pid NUMBER(4),
FOREIGN KEY(pid) REFERENCES person(id)
);CREATE TABLE orders(
o_id int PRIMARY KEY,
orderno int,
pid int,
CONSTRAINT person_fk FOREIGN KEY(pid)
REFERENCES person(id)
); -
修改表时添加:
ALTER TABLE orders ADD FOREIGN KEY(pid) REFERENCES person(id);
ALTER TABLE orders ADD CONSTRAINT person_fk1 FOREIGN KEY(pid)
REFERENCES person(id); -
只能撤销有名字的外键约束:
ALTER TABLE orders DROP CONSTRAINT person_fk;
CHECK(检查约束)
-
简称CK,该约束用于强制要求在指定的字段上每个值都要满足CHECK中定义的条件
-
当定义了CHECK约束的列新增或修改数据时,数据必须符合CHECK约束中定义的条件
-
如CHECK约束不是紧跟在字段后面,那么它里面定义的条件可以包含多个字段
使用 CHECK
-
建表时添加:
CREATE TABLE person(
id NUMBER(3) CHECK(id>0),
name VARCHAR(10),
age NUMBER(3) CHECK(age>0)
);CREATE TABLE person(
id NUMBER(3),
name VARCHAR(10),
age NUMBER(3) CONSTRAINT person_ck CHECK(age>0)
);CREATE TABLE person(
id NUMBER(3),
name VARCHAR(10),
age NUMBER(3),
CHECK(id>0 AND age>0)
);CREATE TABLE person(
id NUMBER(3),
name VARCHAR(10),
age NUMBER(3),
CONSTRAINT person_ck CHECK(age>0 AND id>0)
); -
建表后添加:
ALTER TABLE person ADD CHECK(age>0 AND id>0);
ALTER TABLE person ADD CONSTRAINT person_ck CHECK(id>0 AND age>0);
-
删除检查约束:
ALTER TABLE person DROP CONSTRAINT person_ck;
DEFALUT(默认值)
-
简称DF,用于向列中插入默认值
-
如果没有规定其他的值,那么会将默认值添加到所有的新记录
使用默认值
-
建表时:
CREATE TABLE person(
id NUMBER(4),
name VARCHAR(30),
gender CHAR(1) DEFALUT ‘F’,
age NUMBER(10) DEFAULT 0
); -
建表后:
ALTER TABLE person MODIFY(id DEFAULT 0);
-
撤销约束:
ALTER TABLE person MODIFY(gender DEFAULT NULL);
- 该方法其实和真正意义上的撤销是有区别的,没有找到真正的方法