数据类型
原则:所选择的类型越简单越好,能保存数值的类型越小越好,节省空间。
数值型
整型
特点
1、如果不设置无符号还是有符号,默认是有符号,如果(ˇ?ˇ) 想设置无符号我,需要添加unsigned关键字。
2、如果插入的数值超出了整型的范围,会报out of range异常,并且插入的是临界值。
3、如果不设置长度,会默认的长度 ,长度代表显示的最大宽度,如果不够会用0在左填充,但必须搭配zerofill使用。
create table tab_int(
t1 int ZEROFILL,#0填充
t2 int unsigned #设置为无符号,则t2不能添加负数。
);
小数
定点数
dec(M,D)
decimal(M,D)
浮点数
float(M,D)
double(M,D)
特点:
1、M:整数部位+小数部位,D:小叔部位
2、MD都可以省略,如果是decimal,则M默认为10,D默认为0.如果是float和double,则会根据插入的数值的精度来决定精度。
3、定点型的精确度较高,如果要求插入数值的精度较高如货币运算等考虑使用。
create table tab(
f1 float,
f2 double(5,2),
f3 decimal
)
字符型
较短的文本:char、varchar
特点:
char(M):固定字符长度,耗空间,效率高。
varchar(M):可变字符长度,节省空间,效率较低。
#enum枚举,例子中只能插入a或者b
create table tab_char(
ca1 enum('a','b')
);
#set可在abc中插入多个
create table tab_set(
s1 set('a','b','c')
);
insert into tab_set values('a,c,d)';
较长的文本:text、blob(较长的二进制数据)
日期型
create table tab_date(
t1 datetime,
t2 timestamp
);
insert into tab_date values(now(),now());
show variables like 'time_zone';#显示时区
set time_zone='+9:00';#更改时区
常见约束
含义: 一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性。
六大约束
not null:非空,用于保证该字段的值不能为空,比如姓名、学号等。
default:默认、用于保证该字段有默认值,比如性别。
peimary key:主键,用于保证该字段的值具有唯一性,并且非空,比如学好、员工编号等。
unique:唯一,用于保证该字段的值具有唯一性,可以为空,比如座位号。
check:检查约束【mysql中不支持】,比如年龄,性别。
foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。比如学生表的专业编号去,员工表的部门编号,员工表的工种编号。
约束添加的分类
1、列级约束:只支持:默认、非空、主键、唯一。
2、表级约束:除了非空、默认,其他都支持。
create table 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
);
添加约束的时机
1、创建表时。
#列级约束
create table stuinfo(
id int primary key,
stuName varchar(20) not null,
gender char(1) check(gender='男' or gender='女'), #不支持
seat int unique,
age int default 18,
majorid int references major(id) #不支持
);
create table major(
id int primary key,
majorName varchar(20)
);
#表级约束
create table stuinfo1(
id int,
stuname varchar(20),
gender char(1),
seat int,
age int,
majorid int,
#constraint pk,别名可以不写,但是约束名称不能重复,具体情况看需求,在mysql中它没有任何作用
constraint pk primary key(id),
unique(seat),
check(gender='男' or gender='女'),#不支持
foreign key(majorid) references major(id)
)
2、修改表时,一定是在数据添加之前。
1、添加表级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2、添加表级约束
alter table 表名 add [constraint 约束名] 约束类型(字段名) 外键的引用
#列级约束
alter table stuinfo modify column stuname varchar(20) not null;
#表级约束
alter table stuinfo add primary key(id);
修改表时,删除约束
#1.删除非空约束
alter table stuinfo modify column stuname varchar(20) null;
#删除默认约束(直接不写约束)
alter table stuinfo modify column age int;
#删除主键约束
alter table stuinfo drop primary key;
#删除唯一
alter table stuinfo drop index seat;
#删除外键
alter table stuinfo drop foreign key majorid;
主键和唯一的区别
保证唯一性 | 是否允许为空 | 一个表中是否可以有多个 | 是否可以组合 | |
---|---|---|---|---|
主键 | √ | × | 最多一个 | √,但不推荐 |
唯一 | √ | √ | √ | √,但不推荐 |
外键
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求。
3、主表的关联列必须是一个key(一般是主键或唯一)。
4、插入数据时,现插入主表,再插入从表时,先删除从表,再删除主表。
#主表
create table major(
id int primary key,
majorName varchar(20)
);
#从表
create table stu(
id int,
stuname varchar(20),
gender char(1),
seat int,
age int,
majorid int,
foreign key(majorid) references major(id)
);
标识列(自增长列)
含义:可以不用手动的插入值,系统提供默认的序列值。
create table tab_identity(
id int primary key auto_increment,#自增长列
name varchar(20)
);
#插入数据的方式
insert into tab_identity(id,name) values(null,'john');
insert into tab_identity(name) values('john');
set auto_increment_increment = 3;#设置步长值,每次加3;
补充:
1、标识列必须和主键搭配吗?不一定,但要求是一个key(不可重复)。
2、一个表可以有几个标识列?至多一个!
3、标识列的类型?只能是数值型(整数、浮点数)。
4、标识列可以通过set auto_increment_increment = 3;设置步长,也可以手动插入值,设置起始值。
修改表时设置标识列
#修改表时设置标识列
alter table tab_identity modify column id int primary key auto_increment;
#修改表时删除标识列
alter table tab_identity modify column id int primary key;