MySQL的数据类型
Mysql支持的多种数据类型主要有:数值数据类型、日期/时间类型、字符串类型。
整数
浮点数&定点数
注:定点数以字符串形式存储,对精度要求高时使用decimal较好;尽量避免对浮点数进行减法和比较运算。
时间/日期类型
timestamp:时间戳(实际存储的是一个时间毫秒值),与datetime存储日期格式相同。两者的区别是:
-
timestamp最大表示2038年,而datetime范围是1000~9999
-
timestamp在插入数据、修改数据时,可以自动更新成系统当前时间
字符串类型
blob-二进制大对象,用来存储可变数量的数据。
char(n)、varchar(n)、text都可以表示字符串类型,其区别在于
(1)char(n)在保存数据时,如果存入的字符串长度小于指定的长度n,后面会用空格补全,因此可能会造成空间浪费,但是char类型的存储速度较varchar和text快。
因此char类型适合存储长度固定的数据,这样就不会有空间浪费,存储效率比后两者还快!
(2)varchar(n)保存数据时,按数据的真实长度存储,剩余的空间可以留给别的数据用,因此varchar不会浪费空间。
因此varchar适合存储长度不固定的数据,这样不会有空间的浪费。
(3)text是大文本类型,一般文本长度超过255个字符,就会使用text类型存储。
mysql的字段约束
字段约束/列约束 --> 约束: 限制
6大常见约束
primary key:主键,用于保证该字段的值具有唯一性并且非空;比如学号,员工编号等;
foreign key:外键,用于限制两个表的关系的,用于保证该字段的值必须来自于主表关联列的值;比如学生表的专业编号、员工表的部门编号等;
not null:非空,用于保证该字段的值不能为空;比如用户名字段、学号字段等必填项;
unique:唯一,用于保证该字段的值具有唯一性但可以为空;比如座位号,可以不写,但是写了就不能重复;
default:默认值,用于保证该字段有默认值;比如头像等非必填项,但又需要有个值的字段;
check:检查约束【mysql中不支持】;比如年龄、性别,可以检查插入的值是否为设定好的值或设定范围内的值;
主键约束
主键约束:如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。
主键的作用: 作为一个唯一标识,唯一的表示一条表记录(作用类似于人的身份证号,可以唯一的表示一个人一样。)
添加主键约束,例如将id设置为主键:
create table stu(
id int primary key auto_increment,
...
);
主键自增策略是指:设置了自增策略的主键,可以在插入记录时,不给id赋值,只需要设置一个null值,数据库会自动为id分配一个值(AUTO_INCREMENT变量,默认从1开始,后面依次+1),这样既可以保证id是唯一的,也省去了设置id的麻烦
外键约束
外键其实就是用于通知数据库两张表数据之间对应关系的这样一个列。
这样数据库就会帮我们维护两张表中数据之间的关系。
(1) 创建表的同时添加外键
create table emp(
id int,
name varchar(50),
dept_id int,
foreign key(dept_id) references dept(id)
);
非空约束
非空约束:如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复。
添加非空约束,例如为password添加非空约束:
create table user(
password varchar(50) not null,
...
);
唯一约束
唯一约束:如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空。
添加唯一约束,例如为username添加唯一约束及非空约束:
create table user(
username varchar(50) unique not null,
...
);
约束的添加分类:
1、列级约束
六大约束语法上都支持,但外键约束没有效果
语法:直接在字段名和类型后面追加 约束类型 即可;只支持默认、非空、主键、唯一
//创建学员表
create table stuinfo(
id int primary key,//主键约束
stuName varchar(20) not null,//非空约束
gender char(1) check(gender='男' or gender='女'),//检查约束(mysql不支持,但不报错)
seat int unique,//唯一约束
age int default 18,//默认约束
majorId int references major(id)//外键(在这加不起作用)
);
//创建专业表
create table major(
id int primary key,
majorName varchar(20)
);
2、表级约束
六大约束中除了非空和默认,其他都支持
语法:在各个字段的最下面加【constraint 约束名】约束类型(字段名),中括号里的可以省略,会自动生成索引名
create table stuinfo(
id int,
stuName varchar(20),
gender char(1),
age int default 18,
seat int,
majorId int,
//在这里开始加约束
primary key(id),//主键约束
unique(seat),//唯一约束
foreign key(majorId) references major(id)//外键
);
通用写法
create table stuinfo(
id int primary key,
stuName varchar(20) not null,
age int default 18,
seat int unique,
majorId int,
//加外键
constraint fk_stuinfo_major foreign key(majorId) references major(id)
//一般外键起名字,并且开头用fk_,后面接本表名,后面再接外键主表名,通俗易懂
//foreign key()写的是本表也叫从表的字段名,references major(id)后面接的是主表名和主表关联的字段名
);
外键的特点:
1、要求在从表设置外键关系
2、从表的外键列类型和主表的关联列类型要求一致或兼容,名称无要求
3、主表的关联列必须是一个key(一般是主键或唯一)
4、插入数据时,要先插入主表,再插入从表
5、删除数据时,先删除从表,再删除主表
6、外键有一个更新时和删除时的选项,有以下四种,默认是RESTRICT
①CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
②SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
③RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
④NO ACTION:同 RESTRICT,也是首先先检查外键;