主键: primary key,主要的键. 一张表只能有一个字段可以使用对应的键, 用来唯一的约束该字段里面的数据, 不能重复: 这种称之为主键.
方案1: 在创建表的时候,直接在字段之后,跟primary key关键字(主键本身不允许为空)
create table mytecher (number char(10) primary key, gender enum('男','女','保密')) default '男', phone char(11)) charset utf-8;优点: 非常直接; 缺点: 只能使用一个字段作为主键
方案2: 在创建表的时候, 在所有的字段之后, 使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,可以是复合主键)
create table mystudent (number char(10), name char(10),gender enum('男','女'), phone char(11), class char(10), grade integer defaulte 0, primary key(number,name) charset utf-8;方案3: 当表已经创建好之后, 额外追加主键: 可以通过修改表字段属性, 也可以直接追加. Alter table 表名 add primary key(字段列表); 前提: 表中字段对应的数据本身是独立的(不重复)
create table mydog(id int, sex('公','母') default '公', color set('黄','红','黑','白'); alter table mydog add primary key id;PS:在实际创建表的过程中, 很少使用真实业务数据作为主键字段(业务主键,如学号,课程号); 大部分的时候是使用逻辑性的字段(字段没有业务含义,值是什么都没有关系), 将这种字段主键称之为逻辑主键.
自增长: 当对应的字段,不给值,或者说给默认值,或者给NULL的时候, 会自动的被系统触发, 系统会从当前字段中已有的最大值再进行+1操作,得到一个新的在不同的字段.
自增长特点: auto_increment 1. 任何一个字段要做自增长必须前提是本身是一个索引(key一栏有值) 2. 自增长字段必须是数字(整型) 3. 一张表最多只能有一个自增长,通常是跟主键搭配.
自增长如果是涉及到字段改变: 必须先删除自增长,后增加(一张表只能有一个自增长)
修改当前自增长已经存在的值: 修改只能比当前已有的自增长的最大值大,不能小(小不生效) Alter table 表名 auto_increment = 值;
alter table my_student auto_increment =8;当自增长被给定的值为NULL或者默认值的时候会触发自动增长.
自增长如果对应的字段输入了值,那么自增长失效: 但是下一次还是能够正确的自增长(从最大值+1)
自增长是字段的一个属性: 可以通过modify来进行修改(保证字段没有auto_increment即可) Alter table 表名 modify 字段 类型;
alter table mytable Id int;PS:如何确定下一次是什么自增长呢? 可以通过查看表创建语句看到.
show create table my_student;一张表往往有很多字段需要具有唯一性,数据不能重复: 但是一张表中只能有一个主键: 唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题.
唯一键的本质与主键差不多: 唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)
方案1: 在创建表的时候,字段之后直接跟unique/ unique key
create table myschoolmate(id int primary key auto_increment, name char(10) unique comment '姓名' )charset utf-8;方案2: 在所有的字段之后增加unique key(字段列表); – 复合唯一键
create table myfriend(id int primary key auto_increment, name char(10) comment '姓名' , unique key(name))charset utf-8;方案3: 在创建表之后增加唯一键
create table myfriend(id int primary key auto_increment, name char(10) comment '姓名' )charset utf-8; alter table myfrend add unique key(name);唯一键对比主键: 1.唯一键与主键本质相同: 唯一的区别就是唯一键默认允许为空,而且是多个为空. 2.如果唯一键也不允许为空: 与主键的约束作用是一致的.
更新唯一键: 先删除后新增(唯一键可以有多个: 可以不删除).
Alter table 表名 drop unique key; – 错误: 唯一键有多个 Alter table 表名 drop index 索引名字; – 唯一键默认的使用字段名作为索引名字
alter table myfriend drop index name;几乎所有的索引都是建立在字段之上.
索引: 系统根据某种算法, 将已有的数据(未来可能新增的数据),单独建立一个文件: 文件能够实现快速的匹配数据, 并且能够快速的找到对应表中的记录.
索引的意义 1. 提升查询数据的效率 2. 约束数据的有效性(唯一性等)
增加索引的前提条件: 索引本身会产生索引文件(有时候有可能比数据文件还大) ,会非常耗费磁盘空间.
如果某个字段需要作为查询的条件经常使用, 那么可以使用索引(一定会想办法增加); 如果某个字段需要进行数据的有效性约束, 也可能使用索引(主键,唯一键)
Mysql中提供了多种索引 1. 主键索引: primary key 2. 唯一索引: unique key 3. 全文索引: fulltext index 4. 普通索引: index
全文索引: 针对文章内部的关键字进行索引 全文索引最大的问题: 在于如何确定关键字
英文很容易: 英文单词与单词之间有空格 中文很难: 没有空格, 而且中文可以各种随意组合(分词: sphinx)
范式: Normal Format, 是一种离散数学中的知识, 是为了解决一种数据的存储与优化的问题: 保存数据的存储之后, 凡是能够通过关系寻找出来的数据,坚决不再重复存储: 终极目标是为了减少数据的冗余.
范式: 是一种分层结构的规范, 分为六层: 每一次层都比上一层更加严格: 若要满足下一层范式,前提是满足上一层范式.
六层范式: 1NF,2NF,3NF…6NF, 1NF是最底层,要求最低;6NF最高层,最严格.
Mysql属于关系型数据库: 有空间浪费: 也是致力于节省存储空间: 与范式所有解决的问题不谋而合: 在设计数据库的时候, 会利用到范式来指导设计. 但是数据库不单是要解决空间问题,要保证效率问题: 范式只为解决空间问题, 所以数据库的设计又不可能完全按照范式的要求实现: 一般情况下,只有前三种范式需要满足.
范式在数据库的设计当中是有指导意义: 但是不是强制规范.
第一范式: 在设计表存储数据的时候, 如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么说表的设计不满足第一范式: 第一范式要求字段的数据具有原子性: 不可再分.
第二范式: 在数据表设计的过程中,如果有复合主键(多字段主键), 且表中有字段并不是由整个主键来确定, 而是依赖主键中的某个字段(主键的部分): 存在字段依赖主键的部分的问题, 称之为部分依赖: 第二范式就是要解决表设计不允许出现部分依赖.
要满足第三范式,必须满足第二范式.
第三范式: 理论上讲,应该一张表中的所有字段都应该直接依赖主键(逻辑主键: 代表的是业务主键), 如果表设计中存在一个字段, 并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键: 把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖. 第三范式就是要解决传递依赖的问题.