MySQL数据库约束:
约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
常见的几种约束有:
主键(PRIMARY KEY):是用于约束表中的一行,作为这一行的标识符,在一张表中通过主键就能准确定位到一行,因此主键是十分重要,主键要求这一行的数据不能有重复且不能为空。还有一种特殊的主键,叫做复合主键,主键不仅可以是表中的一列,也可以由表中的两列或多列来共同标志
默认值(DEFAULT):默认值约束规定,当有DEFAULT约束的列,插入数据为空时该怎么办,DEFAULT约束只会在使用INSERT语句时体现出来,INSERT语句中,如果被DEFAULT约束的位置没有值,那么这个位置将会被DEFAULT的值填充。
唯一约束(UNIQUE):比较简单,规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
当INSERT语句新插入的数据和已有的数据重复的时候,如果有UNIQUE约束,则INSERT失败。
外键(FOREIGN KEY):既能确保数据完整性,也能表现表之间的关系。
一个表可以有多个外键,每个外键必须REFERENCE(参考)另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
在INSERT时,如果被外键约束的值没有在参考咧中有对应,比如以下命令,参考列(department表的dpt_name)中没有dpt3,则INSERT失败
ALTER TABLE yourtablename
ADD [CONSTRAINT 外键名] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
说明:
on delete/on update,用于定义delete,update操作.以下是update,delete操作的各种约束类型:
CASCADE:
外键表中外键字段值会被更新,或所在的列会被删除.
RESTRICT:
RESTRICT也相当于no action,即不进行任何操作.即,拒绝父表update外键关联列,delete记录.
set null:
被父面的外键关联字段被update ,delete时,子表的外键列被设置为null.
非空约束(NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。
在MySQL中违反非空约束,不会报错,只会有警告.
为了建立两个MySQL表之间的一个外键关系,必须满足以下三种情况:
* 两个表必须是InnoDB表类型。
* 使用在外键关系的域(字段)必须为索引型(Index)。所以要为设置外键的字段建立index。
* 使用在外键关系的两个域(字段)数据类型要相同。
实例:
CREATE DATABASE mysql_shiyan;
use mysql_shiyan;
CREATE TABLE department
(
dpt_name CHAR(20) NOT NULL,
people_num INT(10) DEFAULT '10',
CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)
);
CREATE TABLE employee
(
id INT(10) PRIMARY KEY,
name CHAR(20),
age INT(10),
salary INT(10) NOT NULL,
phone INT(12) NOT NULL,
in_dpt CHAR(20) NOT NULL,
UNIQUE (phone),
CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)
);
CREATE TABLE project
(
proj_num INT(10) NOT NULL,
proj_name CHAR(20) NOT NULL,
start_date DATE NOT NULL,
end_date DATE DEFAULT '2015-04-01',
of_dpt CHAR(20) REFERENCES department(dpt_name),
CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)
);