接着之前的mysql记录心得,还是砍草了某马的教程,今天主要复习了mysql的约束:
2.1什么数据约束
对用户操作表的数据进行约束
2.2 默认值
作用:当用户对使用默认值的字段不插入值的时候,就使用默认值。
注意:
1)对默认值字段插入null是可以的。
2)对默认值字段可以插入非null
2.3 非空
作用:限制字段必须赋值
注意:
1)非空字符必须赋值
2)非空字符不能赋null
2.4 唯一
作用:对字段的值不能重复
注意:
1)唯一字段可以插入null
2)唯一字段可以插入多个null(注意)
2.5 主键(非空+唯一)---> primary key
作用:非空+唯一
注意:
1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的 id字段。
2.6 自增长 ---> auto_increment
作用:自动递增
2.7 外键(重要)
作用:约束两种表的数据
出现两种表的情况:
解决数据冗余高问题:独立出一张表
例如:员工表 和 部门表
问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!
使用外键约束:约束插入员工表的部门ID字段值
解决办法: 在员工表的部门ID字段添加一个外键约束
用例:
-- 部门表(主表)
CREATE TABLE dept(
id INT PRIMARY KEY,
deptName VARCHAR(20)
)
-- 修改员工表(副表/从表)
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部门名称改为部门ID
--声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY (deptId) REFERENCES dept(id)
-- 外键名称 外键 参考表(参考字段)
)
注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!
3)添加数据:先添加主表,再添加副表
4)修改数据:先修改副表,再修改主表
5)删除数据:先删除副表,再删除主表
2.8 级联操作
问题:当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!
级联修改: ON UPDATE CASCADE
级联删除: ON DELETE CASCADE
用例:
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部门名称改为部门ID
--声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
-- ON CASCADE UPDATE :级联修改
-- 外键名称 外键 参考表(参考字段)
)
注意:级联操作必须在外键基础上使用
3关联查询: (便于理解,一下配合用例说明)
-- 需求:查询员工及其所在部门(显示员工姓名,部门名称)
-- 多表查询规则:1)确定查询哪些表 2)确定哪些哪些字段 3)表与表之间连接条件 (规律:连接条件数量是表数量-1)
-- 2.1 交叉连接查询(不推荐。产生笛卡尔乘积现象:4 * 4=16,有些是重复记录)
例如:SELECT empName,deptName FROM employee,dept;
-- 2.2 内连接查询:只有满足条件的结果才会显示(使用最频繁)
-- 1)确定查询哪些表 -- 2)确定哪些哪些字段 -- 3)表与表之间连接条件
SELECT empName,deptName FROM employee,dept WHERE employee.deptId=dept.id
内连接的另一种语法(条件链接关键字 ON)
SELECT empName,deptName FROM employee INNER JOIN dept ON employee.deptId=dept.id;
-- 使用别名
SELECT e.empName,d.deptName FROM employee e INNER JOIN dept d ON e.deptId=d.id;
-- 2.2 左[外]连接查询:使用左边表的数据去匹配右边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null(注意:左外连接:左表的数据一定会完成显示!)
SELECT d.deptName,e.empName FROM dept d LEFT OUTER JOIN employee e ON d.id=e.deptId;
-- 2.3 右[外]连接查询: 使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null(注意:右外连接:右表的数据一定会完成显示!)
SELECT d.deptName,e.empName FROM employee e RIGHT OUTER JOIN dept d ON d.id=e.deptId;
-- 2.4 自连接查询
SELECT e.empName,b.empName FROM employee e LEFT OUTER JOIN employee b ON e.bossId=b.id;
以上就是今晚的收获, 感谢老师辛苦付出!