1.常见的数据类型
1.数值型:
(1)整型
(2)小数
定点数
浮点数
2.字符型:
(1)较短的文本(char、varchar)
(2)较长的文本(text、blob)
3.日期型
分类:
tinyint(1)、smallint(2)、mediumint(3)、int/integer(4)、bigint(8)
特点:
①:如果没有设置无符号还是有符号,默认为有符号,如果想设置无符号,需要添加关键字unsigned;
②:如果插入的数超多临界值,会报out of range 异常,并且赋值为临界值。
③:如果不设置长度,会有默认的长度,长度代表了默认的最大显示宽度,如果不够会用0在左侧填充,但必须搭配zerofill使用。
分类:
1.浮点型
float(M,D)
double(M,D)
2.定点型
dec(M,D)
decimal(M,D)
特点:
①M和D
M:整数部位+小数部位
D:小数部位
如果超过范围,则会插入临界值
②:M和D都可以省略
如果是decimal,则默认M为10,D为0;如果是float和double则会根据插入的数值的精度来决定精度
③:定点型的精度较高,若需求较高的精度则我们使用定点型。
所选择的类型越简单越好,能保存的数值越小越好。
较短的文本:
char
varchar
较长的文本:
text
blob(较长的二进制)
特点:
写法 M的意思 特点
char char(M) 最大的字符数 固定长度的字符
varchar varchar(M) 最大的字符数 可变长度的字符
char比varchar的效率高
分类:
date只保存日期
time只保存时间
year只保存年
datatime保存日期+时间
timestamp保存日期+时间
特点:
字节 范围 时区的影响
datetime 8 1000-9999 不受
timestamp 4 1970-2038 受
其他:
binary和varbinary用于保存较小的二进制
enum用于保存枚举型
set用于保存集合型
create table tab_test(
name enum('a','b','c')
);
insert into tab_test values('a');
insert into tab_test values('m');
insert into tab_test values('A');
create table tab_test(
name set('a','b','c')
);
insert into tab_test values('a,b,c');
2.常见约束
含义:一种限制、用于限制表中的数据,为了保证数据的准确和可靠性。
分类:六大约束
not null:非空,用于保证该字段的值不能为空
default:默认,用于保证该字段有默认值
primary key:主键,用于保证该字段的值具有唯一性,并且非空,比如学号、员工编号等
unique:唯一,用于保证该字段具有唯一性,可以为空,比如座位号,
check:检查约束【mysql中不支持】
foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束用于引用主表某列的值,比如学生表的专业编号,员工的工种编号
添加约束的时机:
1.创建表时
2.修改表时
约束的添加分类:
列级约束:六大约束语法上都支持,但外键约束没有效果
表级约束:除了默认、非空,其他的都支持
位置 支持的约束类型 是否可以起约束名
列级约束 列的后面 语法都支持,但外键没有效果 不可以
表级约束 所有列的下面 默认和非空不支持,其他支持 可以
create table 表名(
字段名 字段类型 列级约束,
字段名 字段类型
。。。
字段名 字段类型
表级约束
)
主键和唯一键的大对比:
唯一性 允许为空 一个表中可以有多少个 是否允许组合
主键 √ × 至多有一个 允许(不推荐)
唯一 √ √ 可以有多个 允许(不推荐)
外键:
1.要求在从表设置外键关系
2.从表的外键类型要求和主表的关联列的类型要求一致或者兼容,名称无要求
3.主表的关联列必须是一个key(一般是主键或唯一)
4.插入数据时,一般是先插入主表再插入从表,删除数据时,先删除从表再删除主表数据
1、添加列级约束
语法:
直接在字段名和类型后追加约束类型即可
create table student(
id int primary key,
name varchar(20) not null,
gender char(1) check(gender='男' or gender='女'),
seat int unique,
age int default 18,
majorId int foreign key references major(id)
);
2、添加表级约束
语法:在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
create table student(
id int,
name varchar(20),
gender char(1),
seat int,
age int,
majorId int,
constraint pk primary key(id),
constraint uq unique(seat),
constraint ck check(gender='男' or gender='女'),
constraint fk_student_major foreign key(majorId) references major(id)
)
create table if not exists student(
id int primary key,
name varchar(20) not null,
gender char(1),
seat int unique,
age int default 18,
majorId int,
constraint fk_student_major foreign key(majorid) references major(id)
)
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束
2.添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名)【外键的引用】;
alter table student modify column name varchar(20) not null;
alter table student modify column age int default 18;
alter table student modify column id int primary key;
alter table student add primary key(id);
alter table student modify column seat int unique;
alter table student add unique(id);
alter table student add foreign key(majorid) references major(id);
alter table student modify column name varchar(20) null;
alter table student modify column age int;
alter table student drop primary key;
alter table student drop index 唯一键名;
alter table student drop foreign key 外键约束名;
3.标识列
又称为自增长列
含义:可以不用手动插入值,系统提供默认的序列值
特点:
1.标识列必须和主键搭配吗?不一定,但要求是一个key
2.一个表可以有几个标识列?至多一个!
3.标识列的类型只能是数值型
4.标识列可以通过set auto_increment_increment = 3;设置步长,可以通过手动设置值设置起始值。
create table student(
id int primary key auto_increment,
name varchar(20)
)
alter table student modify column id int primary key auto_increment;
alter table student modify column id int;