MySQL学习笔记(3)——数据库设计

MySQL学习笔记(3)——数据库设计

约束

非空约束:

not null,某一列的值不能为null

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

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

唯一约束:

unique,某一列的值不能重复

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

主键约束:

primary key

  1. 含义:非空且唯一

    • 一张表只能有一个字段为主键
    • 主键就是表中记录的唯一标识
  2. 在创建表时,添加主键约束

create table stu(
	id int primary key,-- 给id添加主键约束
	name varchar(20)
);
  1. 删除主键
    错误:alter table stu modify id int ;
    正确:ALTER TABLE stu DROP PRIMARY KEY;

  2. 创建完表后,添加主键
    ALTER TABLE stu MODIFY id INT PRIMARY KEY;

  3. 自动增长:

    1. 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

    2. 在创建表时,添加主键约束,并且完成主键自增长

    	create table stu(
    		id int primary key auto_increment,-- 给id添加主键约束
    		name varchar(20)
    	);
    
    1. 删除自动增长
      ALTER TABLE stu MODIFY id INT;
    2. 添加自动增长
      ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

外键约束:

foreign key,让表于表产生关系,从而保证数据的正确性。

  1. 在创建表时,可以添加外键
create table 表名(
	....
	外键列
	constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
  1. 删除外键
    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

  2. 创建表之后,添加外键
    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

  3. 级联操作

    • 添加级联操作
      ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ;
    • 分类:
      1. 级联更新:ON UPDATE CASCADE
      2. 级联删除:ON DELETE CASCADE

表间关系

一对多(多对一):

多对多:

一对一(了解):

数据库设计范式

几个概念

学号姓名系名系主任课程名称分数
10010张无忌经济系张三丰高等数学95
10010张无忌经济系张三丰大学英语87
10010张无忌经济系张三丰计算机基础65
10011令狐冲法律系任我行法理学77
10011令狐冲法律系任我行大学英语87
10011令狐冲法律系任我行法律社会学65
10012杨过法律系任我行法律社会学95
10012杨过法律系任我行法理学97
10012杨过法律系任我行大学英语99

1. 函数依赖:A==>B
如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如: 学号==>姓名。 (学号,课程名称) ==> 分数
2. 完全函数依赖:A==>B
如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如: (学号,课程名称) ==> 分数
3. 部分函数依赖:A==>B
如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如: (学号,课程名称) ==> 姓名
4. 传递函数依赖:A==>B, B==>C
如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如: 学号==>系名,系名==>系主任
5. 码:
如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如: 该表中码为:(学号,课程名称)
- 主属性:码属性组中的所有属性
- 非主属性:除过码属性组的属性

第一范式(1NF)

每一列都是不可分割的原子数据项

第二范式(2NF)

在1NF的基础上,非码属性必须完全依赖于码 (在1NF基础上消除非主属性对主码的部分函数依赖)

第三范式(3NF)

在2NF基础上,任何非主属性不依赖于其它非主属性 (在2NF基础上消除传递依赖)