MySQL数据库四大约束详解

  • 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。
  • 分类:
    ①、主键约束:primary key
    ②、非空约束:not null
    ③、唯一约束:unique
    ④、外键约束:foreign key

一、非空约束:not null,某一列的值不能为null

  1. 创建表时添加约束
CREATE TABLE stu(
	id INT,
	NAME VARCHAR(20) NOT NULL -- name为非空
);
  1. 创建表完后,添加非空约束
CREATE TABLE stu(
	id INT,
	NAME VARCHAR(20)
);

ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

mysql不是空字符串 mysql非空且唯一_唯一约束

  1. 删除name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);

mysql不是空字符串 mysql非空且唯一_主键约束_02

二、唯一约束:unique,某一列的值不能重复

  1. 注意:唯一约束可以有NULL值,但是只能有一条记录为null
  2. 在创建表时,添加唯一约束
CREATE TABLE stu(
	id INT,
	phone_number VARCHAR(20) UNIQUE -- 手机号
);

mysql不是空字符串 mysql非空且唯一_mysql不是空字符串_03

  1. 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;

mysql不是空字符串 mysql非空且唯一_数据库约束_04

  1. 在表创建完后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

三、主键约束:primary key。

  1. 注意:
    ①、含义:非空且唯一
    ②、一张表只能有一个字段为主键
    ③、主键就是表中记录的唯一标识
  2. 在创建表时,添加主键约束
create table stu(
	id int primary key,-- 给id添加主键约束
	name varchar(20)
);

mysql不是空字符串 mysql非空且唯一_唯一约束_05

  1. 删除主键
-- 错误 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;

mysql不是空字符串 mysql非空且唯一_mysql不是空字符串_06

  1. 创建完表后,添加主键
create table stu(
	id int,
	name varchar(20)
);

ALTER TABLE stu MODIFY id INT PRIMARY KEY;
  1. 自动增长:
  • ①、概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
  • ②、在创建表时,添加主键约束,并且完成主键自增长
create table stu(
	id int primary key auto_increment,-- 给id添加主键约束
	name varchar(20)
);

mysql不是空字符串 mysql非空且唯一_主键约束_07

  • ③、 删除自动增长
ALTER TABLE stu MODIFY id INT;

mysql不是空字符串 mysql非空且唯一_主键约束_08

  • ④、添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

四、外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。

CREATE TABLE emp(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30),
	dep_location VARCHAR(30)
);

INSERT INTO emp VALUES (1, '张三', 20, '研发部', '广州');
INSERT INTO emp VALUES (2, '李四', 21, '研发部', '广州');
INSERT INTO emp VALUES (3, '王五', 20, '研发部', '广州');
INSERT INTO emp VALUES (4, '老王', 20, '销售部', '深圳');
INSERT INTO emp VALUES (5, '大王', 22, '销售部', '深圳');
INSERT INTO emp VALUES (6, '小王', 18, '销售部', '深圳');

mysql不是空字符串 mysql非空且唯一_唯一约束_09

  • 通过上面的表格,我们可以知道,表中的信息是员工在不同的部门里面,于是我们可以将上面的一张表分开,分成两张表格。一张部门的表,一张员工的表。
-- 创建部门表(id,dep_name,dep_location)
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(20),
	dep_location VARCHAR(20)
);

-- 创建员工表(id,name,age,dep_id)
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT -- 外键对应主表的主键 
);

-- 添加两个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL ,'销售部', '深圳');
-- 添加员工信息
INSERT INTO employee (NAME,age,dep_id) VALUES('张三',20,1);
INSERT INTO employee (NAME,age,dep_id) VALUES('李四',21,1);
INSERT INTO employee (NAME,age,dep_id) VALUES('王五',20,1);
INSERT INTO employee (NAME,age,dep_id) VALUES('老王',20,2);
INSERT INTO employee (NAME,age,dep_id) VALUES('大王',22,2);
INSERT INTO employee (NAME,age,dep_id) VALUES('小王',18,2);

mysql不是空字符串 mysql非空且唯一_mysql不是空字符串_10

  • 倘若现在我们把删除department表里面的数据,是可以删除的;但是这不符合实际情况。因为我们此时虽然删除掉了deparment表里的数据,但是employee表里面还是存在部门的信息。只有当部门里面的员工全部开除后,我们才可以删除部门表。

1.添加外键

  1. 在创建表时,可以添加外键:
create table 表名(
	....
	外键列
	constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
-- 创建员工表(id,name,age,dep_id)
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT, -- 外键对应主表的主键 
	CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
);
  1. 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
  1. 创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

2. 级联操作

  • 我们如果要是直接在deparment表中直接将id=1修改为id=5的话,是不可以的。因为department的id被关联到employee表中了,所以修改会产生错误。但是我们可以通过级联操作进行修改。
  1. 添加级联操作
    语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
			FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) 
			ON UPDATE CASCADE ON DELETE CASCADE;
  1. 分类:
    ①、级联更新:ON UPDATE CASCADE
    ②、级联删除:ON DELETE CASCADE
示例演示:

①、删除外键employee表中的外键(因为此时表中已经添加外键,需要先删除)

-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

②、添加外键的同时,还要添加级联操作

ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY ( dep_id ) REFERENCES department ( id ) ON UPDATE CASCADE  ON DELETE CASCADE;

③、倘若我们现在要是删除employee表中id=1的数据,那么department表中的数据也会跟着一起更新数据。

delete from department where id=1;
-- 查询department表数据
select * from department;

mysql不是空字符串 mysql非空且唯一_唯一约束_11

-- 查询employee表数据
select * from employee;

mysql不是空字符串 mysql非空且唯一_非空约束_12