1. 字符类型
1.1 固定长度的字符串 char(L): L不是占用字节的大小, 而是字符串的长度; 字符占用字节的数量和数据库的编码格式息息相关;
char(10): 10 * 类型所用的字节
LATIN1: 一个字符占用1个字节
utf8: 一个字符占用3个字节
eg: char(4): 4 * 3 = 12字节 --utf8字符集
1.2 varchar(L): 可变长度的字符串. L表字符长度, 到底可以存储多少个字符和数据库的编码格式息息相关, 可变意思是在小于固定长度下想开多少就可以开多少
理论上可以存储65535个字符;但是编码格式表示字符并不是1个字节来表示, 而是用n个字符来表示, 则字符串的长度为(65535-(1到3))/n.
1.3 区别:
a. char而言, 定义了之后就开辟好空间了,对varchar而言, 在定义的范围内, 存储多少字符串, 就开辟多大的空间 !!!
b. 但是对于varchar类型,并不是可以超过固定的字符串长度
eg: varchar(100): 存储小于等于100的字符都可以开空间, 但是大于100就不行(告诉你存储不了), 但是char是字符串多大就开多大 char快, varchar慢(char已经开好了, varchar才去开辟, 但是一般用是varchar)
c. 对于varchar类型需要用到1-3字节来保存字符串长度;
utf8类型: 1个字符占用3个字节
(65535-3)/3 = 21844
- 日期和时间类型
2.1 datename: 时间日期类型, 格式: YYYY-MM-DD HH:mm:SS
这个类型需要程序员自己插入时间
2.2 date类型: 只表示年月日, 占用三个字节
2.3 timestamp: 时间戳类型 从1970年开始, 表示的年月日 时分秒YYYY-MM-DD HH:mm:SS (自动补全时间, 可以自己计算当中的年月日 时分秒)
字段1(v1, v2, v3, v4);
不仅只能插入一个, 还可以插入包含多个的一项 v1,v2/v1,v2,v3,v4/...(在这些选项里只能选一个)
- enum:
枚举了很多值, 但是只能在其中选择一个, 如果插入不是枚举出来的值, 就会报错; - set:
列举出来很多值, 可以选择其中的任意多个值进行组合保存, 如果不是列举出来的值, 就会报错
表的约束:
6. 定义字段的时候, 需要有一个类型, 这样的一个类型, 有时候并不能满足我们对列数据的一个约束;
例如:
表字段是否可以为NULL? 有没有默认值? 表字段的解释能不能加上?
对于数字类型的字段可以不可以直到默认表示的位数?
可不可以将这个字段设置成为唯一标识该行数据的呢???
对于字段的约束:
1. 空属性:
NULL: 标识当前字段可以为NULL
NOT NULL: 标识当前字段不可以为NULL, 列的字段指定该属性之后, 在插入数据的时候, 如果不插入该列的数据, 则会报错 !
2. 默认值:
default:
可以在创建表字段的时候, 指定一个默认值, 当我们插入数据的时候, 没有插入该字段的时候, 就采用默认属性;
如果插入数据的会后指定值, 则采用插入值, 而非是默认值
3. 列描述:
就相当于列的备注, 告诉查看该表的用户, 该字段是什么含义, 对于存储数据而言, 并没有实质的约束; 只是供人们来查看该列的含义的, 就相当于C++当中的日志
4. zerofill:
约束了数字的宽度, 如果宽度不够则用0进行填充
eg: 1 宽度为3, 表示的时候则为001
如果指定了zerofill, 则会默认加上unsigned, 无符号属性; 在数据库当中还是存储原来的数值的值; 只不过在查询的时候, 会按照宽度进行输出, 宽度不够, 则用0填充;
相当于格式化输出
5. 主键:
5.1 对于主键而言, 并不是重新开辟了一个新的列, 而是表当中的一列被设置的属性, 这种属性被称之为主键;
5.2 主键的属性保证了该列数据不能为空, 不能重复
5.3 一个表当中只能有一个主键, 不能有多个主键
5.4 通常情况下, 主键在设置的时候, 都是整形类型, 主键的这一列数据可以唯一标识一行数据( 一个班有很多同学, 都有名字,可能会重复, 但是身份证号码绝不会重复,可以作为主键来作为设置, 主键所对应的行也会有这样的属性--> 只能标识人)
5.5 如何设置主键 ?
a. 在创建表的时候, 直接在字段的后面加上关键词"primary key", 就可以设置该字段为主键
create table t6(id primary key, name varchar(20));
b. 在创建表的时候, 将所有字段全部指定完毕之后, 在所有字段的后面, 加上设置主键的关键词, 并且加上指定字段的名称
create table t7(id int, name varcahr(20), primary kay(id));
c. 在创建表的时候, 可以不知道主键列, 创建完成后, 使用alter关键字来增加主键;
alter table t8 add primary kay(id);
5.6 如何删除主键?
使用alter关键字加上drop可以删除
alter table t8 drop primary key;
主键列的值可以唯一标识该行数据, 因为主键不能为空, 不能重复的原因 ! ! !
主键索引: 通过主键来构建一颗B+数, 在用户进行检索数据的时候, 如果约束条件(查找条件)为主键, 则会大大的提高搜索效率, 因为B+的搜索效率高, 可以找到主键对应的一行数据;
自增长:
当我们设置一个字段为自增长的时候, 如果插入数据的时候, 不给该列数据, 则系统会自动填写一个比上一行数值加1的数值填写进去
通常自增长 搭配主键来使用, 主键不可以重复, 每次自增长都会给新的数据分配比上一行+1数值;
条件:
a. 首先字段必须是一个整数, 字段类型需要是一个整数类型
b. 一张表当中最多只能有一个自增长的列
c. 搭配主键来使用
使用: auto_increment
AUTO_INCREMENT=3 (表示着下一次插入数据的时候, auto_increment列预分配的值
获取上次自增加的值, 函数为last_insert_id() ---> 这个函数只能拿到系统自增加的值(对于用户自己插入的id他是拿不到的)
6. 外键:
用于定义主表和从表的一个约束关系;
主表: 就是存放我们基础属性的表(一般用来描述当前表当中的数据用来描述基础的属性)
例如: 班级属性表(班级id, 班级属性(文科, 理科), 班级名称)
从表: 存放具体的用户产生的信息
例如: 学生属性(学生id, 学生名字, 班级id)
1. 定义主表当中可能成为其他表外键的字段, 一定需要将该字段设置成为主键或者唯一键, 因为主键不能重复, 不能为空, 可以唯一标识一行数据(例如上面的班级属性)
2. 定义从表的时候, 设置外键其实就是设置了一个关系, 当前从表的字段和主表当中的字段的关系, 在从表当中插入数据的时候, 会对插入数据进行校验, 校验的标准插入的数据是否存在 在 主表列字段中
外键就是添加了表和表之间的约束关系 ! ! !