文章目录
1. 数据表约束简介
数据库不仅仅是用来存储数据,它还必须保证所存储数据的正确性。如果数据不准确或不一致,那么该数据表的完整性就可能受到了破坏,从而给数据库本身的可靠性带来问题。为了维护数据库中数据的完整性,在创建表时常常需要定义一些约束。
约束 | 说明 |
---|---|
非空约束 | 表示此字段内容不许为空 |
唯一性约束 | 此列的内容不允许重复 |
主键约束 | 表示一个唯一的标识,具有唯一性和非空性 |
外键约束 | 用来约束两个表中列之间的关系 |
检查约束 | 用户自行编写设置的内容的检查条件 |
2. 四种约束介绍
2.1 非空约束
2.1.1 设置非空约束
如果某些列的值时可有可无的,那么可以定义这些列允许为NULL。
CREATE TABLE books
(
BookNo NUMBER(4) NOT NULL,
BookName VARCHAR2(30),
Author VARHAR2(10),
SalePrice NUMBER(9,2),
PublisherNo VARCHAR2(4) NOT NULL,
PublisherDate DATE,
ISBN VARCHAR2(20) NOT NULL
);
2.1.2 修改非空约束
在创建完表后,也可以使用ALTER TABLE … MODIFY 语句为已经创建的表删除或重新定义 NOT NULL约束。
ALTER TABLE books MODIFY bookname NOT NULL;
2.1.3 删除非空约束
ALTER TABLE books MODIFY bookname NULL;
2.2 唯一性约束
唯一性约束是为了解决在一张表中设置除了主键所在列外,多个列都不允许重复数据的存在。
2.2.1 设置约束
创建表时设置约束
CREATE TABLE members
(
MemNo NUMBER(4) NOT NULL,
Phone VARCHAR2(20),
Email VARCHAR2(40),
QQ VARCHAR2(20) CONSTRAINT QQ_UK UNIQUE, -- 设置唯一性约束,QQ_UK是约束名
CONSTRAINT Mem_pk PRIMARY KEY (MemNo) -- 设置MemNo列为主键,
);
如果唯一性约束的列有值,则不允许重复,但是可以插入多个NULL值,即改列的空值是可以重复的。
对现有的表添加唯一性约束
ALTER TABLE Members ADD CONSTRAINT Email_UK UNIQUE (Email);
2.2.2 删除唯一性约束
ALTER TABLE members DROP CONSTRAINT Email_UK;
2.3 主键约束
主键约束用于唯一地标识表中的每一行记录。在一个表中,最多只能有一个主键约束,主键约束既可以有一个列组成,也可以由两个或多个列组成(联合主键)。主键约束同时也具有非空约束的特性。
2.3.1 创建表的同时设置主键约束
CREATE TABLE members
(
MemNo NUMBER(4) NOT NULL,
Phone VARCHAR2(20),
Email VARCHAR2(40),
QQ VARCHAR2(20) CONSTRAINT QQ_UK UNIQUE, -- 设置唯一性约束,QQ_UK是约束名
CONSTRAINT Mem_pk PRIMARY KEY (MemNo) -- 设置MemNo列为主键,
);
2.3.2 创建表之后添加主键约束
ALTER TABLE book ADD CONSTRAINT Mem_pk PRIMARY KEY (MemNo);
2.3.3 删除主键约束
ALTER TABLE book DROP CONSTRAINT Mem_pk;
2.4 外键约束
前面的三种约束都是在一张表中设置的,现在如果需要设置两张关系表的约束,则可以通过外键约束来完成。
2.4.1 设置外键约束
-- 创建两个新表
CREATE TABLE emp_temp as SELECT * FROM EMP;
CREATE TABLE dept_temp as SELECT * FROM DEPT;
-- 为dept_temp表的deptno设置主键;
ALTER TABLE dept_temp ADD CONSTRAINT dept_pk PRIMARY KEY (deptno);
-- 为emp_temp表的empno设置主键;
ALTER TABLE emp_temp ADD CONSTRAINT emp_pk PRIMARY KEY(empno);
-- 为emp_temp表的deptno列创建外键约束
ALTER TABLE emp_temp ADD CONSTRAINT emp_dept_fk
FOREIGN KEY(deptno) REFERENCES dept_temp(deptno);
2.4.2 删除具有外键约束的表
- 删除被引用表的数据前,应先删除外键表所对应的数据;
- 删除被引用表前,应先将外键表删除。
可以使用关键字CASCADEs CONSTRAINT来强制删除被引用表,代码如下:
DROP TABLE dept_temp CASCADE CONSTRAINT;
2.4.3 删除外键约束
ALTER TABLE emp_temp DROP CONSTRAINT emp_dept_fk;
3. 禁用和激活约束
约束创建之后,如果没有经过特殊处理,该约束就一直起作用。但也可以根据实际需要,临时禁用某个约束。当某个约束被禁用后,该约束就不再起作用了,但它还存在于数据库中。
3.1 在定义约束时禁用
在使用CREATE TABLE或ALTER TABLE语句定义约束时,如果使用关键字DISABLE,则约束是被禁用的。
CREATE TABLE StuInfo
(
StuCode VARCHAR2(4) NOT NULL,
StuName VARCHAR2(10) NOT NULL,
/*
check约束即检查约束,它的作用为对表中的数据进行过滤,在更新数据时,数据
只有满足指定的过滤条件,才可以更新成功,否则不能更新。
*/
AGE INT CONSTRAINT Age_ck CHECK (age>0 and age<120) DISABLE
);
3.2 禁用已经存在的约束
ALTER TABLE Books_1 DISABLE CONSTRAINT BOOK_PK;
3.3 激活约束
ALTER TABLE books_1 ENABLE CONSTRAINT BOOK_PK;
3.4 删除约束
ALTER TABLE books_1 DROP CONSTRAINT BOOK_PK;