1 介绍
约束是一种限制,通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
2 约束分类
- 主键:PRIMARY KEY
主键 (PRIMARY KEY)是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。主键不能有重复且不能为空
- 默认值: DEFAULT
默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
INSERT语句中,如果被 DEFAULT 约束的位置没有值,那么这个位置将会被 DEFAULT 的值填充
- 唯一: UNIQUE
唯一约束 (UNIQUE) ,规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
当 INSERT 语句新插入的数据和已有数据重复的时候,如果有 UNIQUE约束,则 INSERT 失败
- 外键: FOREIGN KEY
外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
一个表可以有多个外键,每个外键必须参考另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
在 INSERT 时,如果被外键约束的值没有在参考列中有对应,则INSERT 失败
- 非空: NOT NULL
被非空约束的列,在插入值时必须非空
3 示例
1)创建数据库、表
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)
);
2)示例
// 默认值示例
mysql> INSERT INTO department VALUES('dept1',20);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO department (dpt_name) VALUES('dept2');
Query OK, 1 row affected (0.00 sec)
mysql> select * from department;
+----------+------------+
| dpt_name | people_num |
+----------+------------+
| dept1 | 20 |
| dept2 | 10 |
+----------+------------+
2 rows in set (0.00 sec)
// 外键约束示例
// 参考列department(dpt_name)中没有dept3,所以出错
mysql> INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dept3');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mysql_shiyan`.`employee`, CONSTRAINT `emp_fk` FOREIGN KEY (`in_dpt`) REFERENCES `department` (`dpt_name`))
mysql> INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dept2');
Query OK, 1 row affected (0.00 sec)