约束
约束条件包括:
非空约束(Not Null),简称NN
唯一性约束(Unique),简称UK
主键约束(Primary Key),简称PK
外键约束(Foreign Key),简称FK
检查约束(Check),简称CK
非空约束
非空约束用于确保字段值不为空。默认情况下,任何列都允许有空值,但业务逻辑可能会要求某些列不能取空值。当某个字段被设置了非空约束条件,这个字段中必须存在有效值,即:
*当执行INSERT操作时,必须提供这个列的数据
*当执行UPDATE操作时,不能给这个列的值设置为NULL
建表时添加非空约束
CREATE TABLE employees_swm(
eid NUMBER(6),
name VARCHAR2(30) NOT NULL,
salary NUMBER(7,2),
HIREDATE DATE CONSTRAINT employees_hiredate_nn_swm NOT NULL
)
- 1
- 2
- 3
- 4
- 5
- 6
修改表时添加非空约束
可以在建表之后,通过修改表的定义,添加非空约束
ALTER TABLE employees_swm
MODIFY (eid NUMBER(6) NOT NULL)
- 1
- 2
唯一性约束
唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值。当给表的某个列定义了唯一约束条件,该列的值不允许重复,但允许是NULL值。
唯一性约束条件可以在建表同时建立,也可以在建表以后再建立。
添加唯一性约束
在建表employees的同时,在eid、email列上创建唯一约束条件,并在建表后在name列上建立一个名为employees_name_uk的唯一约束条件:
CREATE TABLE employees1_swm(
eid NUMBER(6) UNIQUE,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE,
CONSTRAINT employees_email_uk_swm UNIQUE(email)
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在建表之后增加唯一性约束条件:
ALTER TABLE employees1_swm
ADD CONSTRAINT employees_name_uk UNIQUE(name);
- 1
- 2
INSERT INTO employees1_swm
(eid,name,email)
VALUES
(1,'JACK','JACK@QQ.COM')
- 1
- 2
- 3
- 4
主键约束
主键(Primary Key)约束条件从功能上看相当于非空(NOT NULL)且唯一(UNIQUE)的组合。
主键字段可以是单字段或多字段组合,即:在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值。
主键可以用来在表中唯一的确定一行数据。一个表上只允许建立一个主键,而其它约束条件则没有明确的个数限制。
主键选取的原则
主键应是对系统无意义的数据
永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途
主键不应包含动态变化的数据,如时间戳
主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义
主键尽量建立在单列上
添加主键约束条件
在建表时添加主键约束条件
CREATE TABLE employees2_swm(
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
建表后创建主键约束条件,并自定义约束条件名称
ALTER TABLE employees2_swm
ADD CONSTRAINT employees2_swm_eid_pk PRIMARY KEY (eid);
- 1
- 2
外键约束(几乎不用)
外键约束的意义
外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系。比如emp表的deptno列参照dept表的deptno列,则dept称作主表或父表,emp表称作从表或子表。
添加外键约束
建表时添加外键约束条件
CREATE TABLE employees4 (
eid NUMBER(6),
name VARCHAR2(30),
salary NUMBER(7, 2),
deptno NUMBER(4)
);
- 1
- 2
- 3
- 4
- 5
- 6
在建表后建立外键约束条件
ALTER TABLE employees4
ADD CONSTRAINT employees4_deptno_fk
FOREIGN KEY (deptno) REFERENCES dept(deptno);
- 1
- 2
- 3
外键约束对一致性的维护
外键约束条件包括两个方面的数据约束:
从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL;
当主表参照列的值被从表参照时,主表的该行记录不允许被删除。
--成功DML语句:
INSERT INTO employees4(eid, name, deptno)
VALUES(1234, ‘rose tyler’, 40);--成功
INSERT INTO employees4(eid, name, deptno)
VALUES(1235, ‘martha jones’, NULL); --成功
--失败DML语句:
INSERT INTO employees4(eid, name, deptno)
VALUES(1236, 'donna noble', 50);
--失败,不存在部门50
DELETE FROM dept WHERE deptno = 40;
--失败,40被参照,不允许删除
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
外键约束对性能的降低
如果在一个频繁DML操作的表上建立外键,每次DML操作,都将导致数据库自动对外键所关联的对应表做检查,产生开销,如果已在程序中控制逻辑,这些判断将增加额外负担,可以省去。
另外外键确定了主从表的先后生成关系,有时会影响业务逻辑。
关联不一定需要外键约束
如果业务逻辑要求保证数据完整性,可由程序或触发器控制,不一定需要外键约束。
另外为了简化开发,维护数据时不用考虑外键约束,以及大量数据DML操作时不需考虑外键耗费时间。
检查约束
检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件。当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件。
添加检查约束
员工的薪水必须大于2000元,增加检查约束:
ALTER TABLE employees2_swm
ADD CONSTRAINT employees2_swm_salary_check
CHECK (salary > 2000);
- 1
- 2
- 3
当插入大于2000的数据,操作成功:
INSERT INTO employees2_swm
(eid,name,salary,deptno)
VALUES
(1234,'donna noble',2400,40)
- 1
- 2
- 3
- 4
试图修改职员的薪水为1500元,更新失败:
UPDATE employees2_swm
SET salary=1500
WHERE eid=1234
- 1
- 2
- 3
转自IsSwm的博客:https://blog.csdn.net/qq_27853161/article/details/53608699