**
一、基本概念
**
约束是对表中数据进行限定,保证数据的正确定、有效性和完整性
**
二、约束的分类
**
1.主键约束:Primary Key
1.注意:
含义:非空且唯一
一张表只能有一个字段为主键
主键就是表中记录的唯一标识
2.在创建表的时候,添加主键约束
CREATE TABLE person(
id int primary key, -- 编号,并添加主键约束
NAME varchar(20)
);
3.在创建表完后,添加主键约束
ALTER TABLE person MODIFY id INT PRIMARY KEY;
4.删除主键约束
-- 不用声明是哪个字段,因为一个表中有且仅有一个主键约束
ALTER TABLE person DROP PRIMARY KEY;
5.自动增长
1.概念:如果某一列是数值类型的,使用关键字auto_increment可以完成值的自动增长
该关键字通常和int类型主键一起配合使用
2.在创建表时,添加主键约束,并完成主键的自动增长
CREATE TABLE person(
id INT PRIMARY KEY AUTO_INCREMENT, -- 编号,设置主键约束,并完成自动增长
NAME varchar(20) -- 姓名
);
-- 添加主键约束后,NAME不能为null,但因为添加了AUTO_INCREMENT关键字,所以可以添加成功,并自动增长为3
INSERT INTO person(id, NAME) VALUES(NULL, "aaa");
3.在创建表之后,添加自动增长
AlTER TABLE person MODIFY id INT AUTO_INCREMENT;
4.删除自动增长
ALTER TABLE person MODIFY id INT; -- 该写法,自动增长可以删除,主键约束不可以删除
2.非空约束:not null,某一列值不能为null
1.创建表时添加约束
-- 创建一个表
CREATE TABLE person(
id INT, -- 编号
NAME VARCHAR(20) NOT NULL -- 姓名,并添加非空约束
);
SELECT * FROM person; -- 查看表中的数据
-- 向表中添加数据,NAME非空,可以添加成功
INSERT INTO person(id, NAME) VALUES(1, "张三");
-- 向表中添加数据,NAME为NULL,不可以添加进数据库中,会报错
INSERT INTO person(id, NAME) VALUES(2, NULL);
2.创建表之后,再添加非空约束
ALTER TABLE person MODIFY NAME VARCHAR(20) NOT NULL;
3.删除非空约束
-- 删除NAME的非空约束
ALTER TABLE person MODIFY NAME VARCHAR(20);
3.唯一约束:unique,某一列的值不能重复
1.在创建表时,添加唯一约束
CREATE TABLE person(
id INT, -- 编号
phone_number VARCHAR(20) UNIQUE -- 手机号,并添加唯一约束
);
2.在创建完表之后,添加唯一约束
ALTER TABLE person MODIFY phone_number VARCHAR(20) UNIQUE;
3.删除唯一约束
ALTER TABLE person DROP INDEX phone_number;
4.注意:
唯一约束可以有NULL值,但是只能有一条记录为NULL
4.外键约束:foreign key
外键约束是让表与表之间产生关系,从而抱枕数据的正确性
1.在创建表时,可以添加外键
语法:
CREATE TABLE 表名(
字段列表,
...,
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
2.在创建完表之后,再添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES department(主表列名称)
3.删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
外键约束实例分析:
-- 创建emp表
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 (NAME, age, dep_name, dep_location) VALUES ("张三", 18, "研发部门", "北京");
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("李四", 18, "研发部门", "北京");
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("王五", 20, "研发部门", "北京");
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("赵六", 18, "销售部门", "上海");
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("田七", 25, "销售部门", "上海");
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("钱八", 20, "销售部门", "上海");
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("孙九", 40, "管理部门", "深圳");
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("张十", 35, "管理部门", "深圳");
-- 查看emp表中的数据
SELECT * FROM emp;
-- 【存在的问题1】:数据有冗余,研发部门-北京,销售部门-上海,管理部门-深圳,这些都是重复数据
-- 【1的解决办法】:表的拆分。拆成两张表,一张表存放员工信息,另一张表存放部门信息,然后关联两张表即可。
-- 创建部门表(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)
-- 【2的修改的地方】:添加外键约束让employee表的dep_id列【关联】department表的id列
-- 多方,从表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT, -- 编号,主键约束,自动增长
NAME VARCHAR(20), -- 姓名
age INT, -- 年龄
dep_id INT, -- 外键对应主表的主键
CONSTRAINT emp_dep_id FOREIGN KEY (dep_id) REFERENCES department(id)
);
-- 【存在的问题2】:张三,李四,王五属于1号部门,但是1号部门可以随时删除掉,不符合现实逻辑,应该是部门的人删除掉以后,才能把部门删除掉
-- 【2的解决方案】:让employee表的dep_id列【关联】department表的id列
-- 删除emp表,department表,employee表
DROP TABLE emp;
DROP TABLE department;
DROP TABLE employee;
5.约束操作技巧
删除约束:
非空、唯一、主键、外键:只有第一个非空约束是用MODIFY,其他三个都是用DROP
添加约束:
非空、唯一、主键、外键:前三个是用MODIFY,只有最后一个外键约束是用ADD