Mysql高级特性
约束
约束得概念:约束得作用与表中列得规则,用于限制加入表得数据,约束得存在保证了数据库中数据得正确性,有效性,和完整性
约束得分类
非空约束(NOT NULL) 保证列中所有数据不能由null值
唯一约束(UNIQUE) 保证列中所有数据各有不同
主键约束(PRIMARY KEY) 主键是一行数据得唯一标识,要求非空且唯一
检查约束(CHECK) 保证列中得值满足某一条件
默认约束(DEFAULT) 保存数据时,未指定值则采用默认值
外键约束(FOREIGN KEY) 外键用来让连个表得数据建立连接,保证数据得一致性和完整性
注意MYSQL不支持检查约束
示例:
案例,根据需求,为表添加合适得约束
先创建一个表
--员工表
CREATE TABLE emp(
id INT,--员工id 主键且自增长
ename VARCHAR(50),--员工姓名,非空且唯一
joindate DATE,--入职日期,非空
salary DOUBLE(7,2),--工资,非空
bonus DOUBLE(7,2)--奖金,如果没有奖金默认为0
);
-- 添加一条数据
INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(1,'张三','2022-5-8',4200,500);
-- 尝试着查看是否成功
SELECT *FROM emp;
DELETE FROM emp;
-- 演示主键约束
INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(1,'张三','2022-5-8',4200,500);
-- 会报错 端口号重复 Duplicate entry '1' for key 'PRIMARY'
INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES('张三','2022-5-8',4200,500);
-- 会报错 端口号为空Column count doesn't match value count at row 1
-- 演示非空约束:not NULL
INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(2,NULL,'2022-5-8',4200,500);
-- Column 'ename' cannot be null 名称不能为null
-- 显示唯一约束
INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(3,'张三','2022-5-8',4200,500);
-- Duplicate entry '张三' for key 'ename' 已经有张三了 不能再添加了
-- 显示默认约束
INSERT INTO emp(id,ename,joindate,salary) VALUES(4,'sx','2022-5-8',4200);
-- 数据添加成功 以前添加数据失败 默认值为null 现在默认值为0
-- 如果奖金值给null得话 不会走默认值0 会认为你给的null null是一个特殊得值
-- 演示自动增长 auto_increment
-- 要求 1.数字 2.唯一
-- 创建第一条数据
INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(1,'张三','2022-5-8',4200,500);
-- 创建第二条数据 不给id赋值
INSERT INTO emp(ename,joindate,salary,bonus) VALUES('李四','2022-5-8',4200,500);
-- 第二条数据则会为2
外键约束:
概念:外键时用来让两个表得数据建立连接,保证数据得一致性和完整性
语法
1.添加外键约束
CREATE TABLE 表名(
列名 数据类型,
列名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);
2.建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
3.删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);
-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','广州'),('销售部', '深圳');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES
('张三', 20, 1),
('李四', 20, 1),
('王五', 20, 1),
('赵六', 20, 2),
('孙七', 22, 2),
('周八', 18, 2);
-- ------------------
select * from emp;
-- 删除外键
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept;
-- 添加外键
ALTER TABLE emp add CONSTRAINT fk_emp_dept FOREIGN KEY (dep_id) REFERENCES (id);
注意:优先添加部门表和部门数据,其次是员工表和员工数据,否则会报错