1>数据类型
1.1>数值类型
-->整型:tinyint,smallint,mediumint,int,bigint
-->小数:float,double,decimal(内部原理是以字符串形式存储)
各类型保存的整数数据范围如下:
tinyint默认为有符号,即数字前有正负号;若要设置为无符号的,需用unsigned参数
int默认为有符号,bigint也一样。
如,create table t2(x tinyint unsigned);
注意:指定整型类型时,后面均不必指定‘宽度’,如直接写int,而不用写int(4),因为整型的这个宽度与
其他类型不同,这里为显示宽度,比如这里设置了4,默认设定成4个字符的宽度,当超出就自动加宽,所以,
这个设定基本没有意义,而且还容易坑人。
小数型类型的用法如下,
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
随着小数的增多,精度变得不准确
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
随着小数的增多,精度比float要高,但也会变得不准确
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
对于精确数值计算时需要用此类型,decaimal能够存储精确值的原因在于其内部按照字符串存储。
1.2>日期类型
YEAR:格式YYYY,范围(1901-2155),
DATE:格式YYYY-MM-DD,范围(1000-01-01至9999-12-31),
TIME:格式HH:MM:SS,范围(-838:59:59 - 838:59:59),
DATETIME:格式YYYY-MM-DD HH:MM:SS,范围(1000-01-01 00:00:00/9999-12-31 23:59:59)
TIMESTAMP:格式YYYYMMDD HHMMSS,范围(1970-01-01 00:00:00/2037 年某时)
datetime与timestamp的区别
-->日期范围不同,datetime范围更大
-->datetime使用8字节的存储空间,timestamp的存储空间为4字节,所以,timestamp更省空间。
-->datetime默认值为null,timestamp的默认值not null,默认为当前时间。
其实实际应用场景中,这两种类型都能满足我们的需求,当然,最常用的还是datetime了。
1.3>字符串类型
--->char:定长,存取速度快,浪费空间
--->varchar:不定长,存取速度慢,节省空间
char存放数据时,若设置位宽为4,数据不够时后面补空格填充,所以浪费空间,因为存的是4的定长,所以取的时候
直接4个4个这样取就行了,简单粗暴。
varchar存放数据时,若设置位宽为4,不管数据多少,都要一个bytes为用来存放数据长度信息(不然取的时候不知道
怎么截取),所以如上图,尽管存入一个空格,也有一个bytes长度,存放的就是数据长度的信息,存的时候要加长度一起
存,所以速度相对较慢,取的时候同理,要先读取1bytes里面的数据长度,再根据长度去截取数据,所以取的效率也相对
较慢,当数据小于设置位宽时,确实是更省空间的,
但是,现今社会,大部分场景下,存取速度都比占磁盘容量更优先考虑,所以,大部分时候我们都用char,肯定也有用
varchar的时候,但是不管用哪种,记住,不要混着用,一个数据或者一张表要么全用char,或者全用varchar。
其他:
char存放数据,不够定长时后面补空格,但是取的时候会默认把后面的空格删掉,记住:它默认补后面,也只会删后面
的空格,前面或者中间的,则不管。
可以用 SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; 让他‘现出原形’。
1.4>枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
若选值不在枚举或者集合以内,会报错。
2>完整性约束
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
2.1>not null 与 default
是否可空,null表示可空,非字符串
not null - 不可空
默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值。
例子
2.2>unique
设置唯一约束,单列唯一 或联合唯一(多个列的数据组合到一起为唯一)
单列唯一设置的2中方法,
联合唯一的设置方法
2.3>primary key
primary key字段的值不为空且唯一
对于innodb存储引擎来说,一张表内必须有一个主键,这是该引擎特有的一个机制,如果没有设置主键
则系统会自动找一列数据非空且唯一的列作为主键,若没有该列,则会生成一个隐藏的列作为主键,
所以,在innodb存储引擎下建表时,我们最好设置一个主键,大部分情况下就设id就好了。
单列做主键
多列做主键(复合主键)
但一个表内只能有一个主键primary key
多列主键示例,约束同联合唯一且非空。
2.4>auto_increment
约束字段为自动增长,被约束的字段必须同时被key约束
也可以指定id,比如此时默认到3了,我下一条记录指定为5,那么,再下一次自增就基于5开始(也就是
最后一条记录开始自增),
其他了解知识:如上,id是从1开始自增(初始值),并且每次增加为1(步长),这个值是可以设置的。
set global auto_increment_increment=5; # 设置步长
set global auto_increment_offset=3; # 设置初始值
设置完需重新登录客户端生效,并且初始值不能大于步长。
看下delete和truncate删除数据的区别;
所以,我们应尽量使用truncate 删除数据。
2.5>foreign key
关联表,建立表之间的关系
建表顺序: 先建立被关联的表,并保证被关联字段唯一。
再创建关联的表。
插入数据顺序:先插入被关联的表,再插入关联的表。
实际当中做表关联用的不是太多,表之间的关联一般是逻辑关联,通过应用实现,并不是这种强耦合式的,
因为关联起来,很容‘牵一发而动全身’,不易扩展,所以一般都是理清逻辑关系,通过其他途径使表之间
看起来像存在着关联关系。