数据完整性分类:
1、实体完整性
PRIMARY KEY约束
UNIQUE约束 (唯一值)
自增特性 auto_increment
2、域完整性
数据类型
非空约束 not null
CHECK约束 MySQL不支持
DEFAULT约束
3、参照完整性
FOREIGN KEY约束
4、用户自定义完整性
存储过程和触发器
** 约束。
1、NOT NULL约束
功能:限制用户向表中插入数据时,某列必须插入值,不允许为空
添加约束的方法:在列的定义后面直接添加关键字NOT NULL。(不写默认为NULL)
示例:
CREATE TABLE student
(
stuID CHAR(5) NOT NULL,
stuName VARCHAR(10) NOT NULL,
stuSex ENUM('男', '女') #此列允许不插入值
)
验证NOT NULL约束的功能
另一种添加非空约束的方法:、
create table t1(tid NUMBER);
alter table t11 modify tid char(5) not null;
(可以既改变类型,又添加约束)
2、DEFAULT约束
当INSERT语句没有指定值时,DEFAULT约束会在列中输入一个默认值。
定义DEFAULT约束的语法 :
DEFAULT constraint_expression
MySQL中的默认值约束有一个限制,即:默认值只能是一个常量,不能象Oracle那样允许函数。
只有一个例外:CURRENT_TIMESTAMP
下面这些语句是等效的:
CREATE TABLE t (ts TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
3、PRIMARY KEY约束
PRIMARY KEY约束用来实现实体完整性
确保特定的列中不允许重复,且不许为NULL
PRIMARY KEY约束定义了表的主键,它可以唯一地标识一行。
每个表只能定义一个PRIMARY KEY约束
可以定义在一列或多列上
定义PRIMARY KEY约束的语法 :
[CONSTRAINT constraint_name]
PRIMARY KEY {(column_name [,…])}
示例:
DROP TABLE t_doctor;
CREATE TABLE t_doctor
(
doc_id CHAR(5) PRIMARY KEY,
doc_name CHAR(8) NOT NULL,
sex CHAR(2),
phone VARCHAR(20)
);
* 病人表,注意:不支持注释符--
CREATE TABLE t_patient
(
pat_id CHAR(5),
pat_name CHAR(8) NOT NULL,
sex CHAR(2),
PID CHAR(18),
phone VARCHAR(20),
CONSTRAINT pk_patient_id PRIMARY KEY(pat_id)
CONSTRAINT pk_patient_id 也可以省略
)
4、UNIQUE约束UNIQUE约束也用来实现实体实整性
UNIQUE约束表明同一列的任意两行都不能具有相同值。
可以插入多个NULL(与其他的DBMS不一样)
若表中已有一主键,但又想保证其他的列也是唯一的,可以定义UNIQUE约束。
一个表中可以有多个UNIQUE约束
定义UNIQUE约束的语法 :
[CONSTRAINT constraint_name]
UNIQUE {(column_name [,…])}
在创建表时添加UNIQUE约束
DROP TABLE t_patient;
CREATE TABLE t_patient
(
pat_id CHAR(5) PRIMARY KEY,
pat_name CHAR(8) NOT NULL,
PID CHAR(18) UNIQUE,
/* CONSTRAINT un_PID UNIQUE(PID) */
);
5、CHECK约束
CHECK约束通过对输入到特定列的值设置检查条件,将输入数据限制为指定的值
可以在单列或多列上创建CHECK约束
定义CHECK约束的语法 :
在创建表时,也可以为表添加CHECK约束:
CREATE TABLE t_patient
(
pat_id CHAR(5) PRIMARY KEY,
pat_name CHAR(8) NOT NULL,
sex CHAR(2) CHECK(sex='男' OR sex='女'),
PID CHAR(18),
phone VARCHAR(20),
CONSTRAINT ck_patient_PID CHECK(length(PID)=18 OR length(PID)=15)
);
6、FOREIGN KEY约束
FOREIGN KEY约束定义了表之间的一致性关系,用于强制参照完整性。
FOREIGN KEY约束定义了对同一个表或其他表的列的引用,这些列具有PRIMARY KEY或者UNIQUE约束。
定义FOREIGN KEY约束的语法 :
[CONSTRAINT constraint_name]
[FOREIGN KEY(column_name [,…])]
REFERENCES ref_table[(ref_column_name [,…])]
[ON DELETE {CASCADE | SET NULL|NO ACTION}]
[ON UPDATE {CASCADE | SET NULL|NO ACTION}]
DROP TABLE t_record;
CREATE TABLE t_record
(
pat_id CHAR(5) REFERENCES t_patient(pat_id), #MySQL中这样写创建不上约束
admission_date DATE,
doc_id CHAR(5),
diagnosis NVARCHAR(500),
FOREIGN KEY(pat_id) REFERENCES t_patient(pat_id),
FOREIGN KEY(doc_id) REFERENCES t_doctor(doc_id)
)
7、级联引用完整性
[ON DELETE {CASCADE | SET NULL|NO ACTION}]
[ON UPDATE {CASCADE | SET NULL|NO ACTION}]
CASCADE使用级联,删除或更新主表数据时,同时删除从表中的数据或将从表中的数据自动更新。
SET NULL选项则在删除或更改主表数据时,自动将从表中相应数据设置为空。
NO ACTION不使用级联
ALTER TABLE t_record
ADD CONSTRAINT fk_record_docid
FOREIGN KEY(doc_id) REFERENCES t_doctor(doc_id)
ON DELETE CASCADE;
ALTER TABLE t_record
ADD CONSTRAINT fk_record_patid
FOREIGN KEY(pat_id) REFERENCES t_patient(pat_id)
ON DELETE SET NULL;
8、删除约束
ALTER TABLE table_name
DROP PRIMARY KEY #删除主键约束
| DROP INDEX index_name #可用此句删除唯一约束
| DROP FOREIGN KEY fk_symbol #删除外键约束
NOT NULL与DEFAULT约束以修改列的方式实现
CHECK约束根本就没有保存
ALTER TABLE t_record DROP foreign key fk_record_docid;
ALTER TABLE t_record DROP foreign key fk_record_patid;
9、查看表中的约束
Show create table t_record;