MySQL 高级

109 阅读3分钟

MySQL 高级

1. 约束

1.1 概念

  • 约束是作用于表中列上的规则,用于限制加入表的数据

    例如:我们可以给id列加约束,让其值不能重复,不能为null值。

  • 约束的存在保证了数据库中数据的正确性、有效性和完整性

    添加约束可以在添加数据的时候就限制不正确的数据,年龄是3000,数学成绩是-5分这样无效的数据,继而保障数据的完整性。

1.2 分类

  • 非空约束: 关键字是 NOT NULL

    保证列中所有的数据不能有null值。

    例如:id列在添加 马花疼 这条数据时就不能添加成功。

  • 唯一约束:关键字是 UNIQUE

    保证列中所有数据各不相同。

    例如:id列中三条数据的值都是1,这样的数据在添加时是绝对不允许的。

  • 主键约束: 关键字是 PRIMARY KEY

    主键是一行数据的唯一标识,要求非空且唯一。一般我们都会给没张表添加一个主键列用来唯一标识数据。

    例如:上图表中id就可以作为主键,来标识每条数据。那么这样就要求数据中id的值不能重复,不能为null值。

  • 检查约束: 关键字是 CHECK

    保证列中的值满足某一条件。

    例如:我们可以给age列添加一个范围,最低年龄可以设置为1,最大年龄就可以设置为300,这样的数据才更合理些。

    注意:MySQL不支持检查约束。

    这样是不是就没办法保证年龄在指定的范围内了?从数据库层面不能保证,以后可以在java代码中进行限制,一样也可以实现要求。

  • 默认约束: 关键字是 DEFAULT

    保存数据时,未指定值则采用默认值。

    例如:我们在给english列添加该约束,指定默认值是0,这样在添加数据时没有指定具体值时就会采用默认给定的0。

  • 外键约束: 关键字是 FOREIGN KEY

    外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。

    外键约束现在可能还不太好理解,后面我们会重点进行讲解。

示例:

CREATE TABLE emp (
	id INT PRIMARY KEY auto_increment , -- 员工ID,主键且自增长
	ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空且唯一
	joindate DATE NOT NULL, -- 入职日期,非空
	salary DOUBLE (7,2) NOT	NULL, -- 工资,非空
	bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
);


# 外键示例:
-- 删除表
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,
	
	-- 添加外键 dep_id,关联 dept 表的 id 主键
	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 dept(id);

2. 数据库设计

3. 多表查询

4. 事务