中文问题
Mysql数据库需要知道客户端使用什么编码,
来进行正确的编码转换
set names gbk;
告诉服务器,自己是gbk编码
Set names utf8;
告诉服务器 自己是utf-8 编码
数据类型
**数字**
**unsigned标记**
添加 unsigned表示无符号,只有正数
zerofill标记
**int(4) zerofill**
显示时,不足4位会补0
0001
0012
0123
超过4位按照实际走 1234567
**tinyint**
1字节
**smallint**
2字节
**int**
4字节
int(3)
小括号数字,只影响查询显示格式,
而不影响数字范围
3
12
123
3345663
**bigint**
8字节
**float**
4字节
**double**
8字节
**decimal/numeric**
定点浮点数,可以做精确运算
decimal(6,2)
整数4为,小数2位,总共6位
整数超出范围,可能会报错
小数超出范围,会四舍五入
字符串
**char(20)**
定长字符串,
超出长度,可能会出错,也可能会截断
如果长度不足,会补空格
最长 255
效率更高
**varchar(20)**
变长字符串
最大长度是255内,前面需要一个字节来表示长度
最大长度超过255,前面需要两个字节来表示长度
最长65535字节
一般用varchar保存255内的字符串
**text**
65535字节
只占用表总字节量的10个字节
**blob**
超大对象数据
要使用流来读写blob字段数据
通常不用blob保存文本
## 日期时间
datetime
年月日时分秒
date
年月日
time
时分秒
timestamp
时间戳
年月日时分秒
最大只到 2038年
修改一行数据时,第一个 timestamp 字段会自动更新为系统当前时间
不能取null值,填入null值时,会自动填入系统当前时间
一般不用
约束
对一个字段的取值进行限制
主键约束
唯一标识一行数据
例如:
id 学号 姓名 性别
1 1002345 xx xx
2 345342
3 4564745
4 743553242
5 36345
6 4356456
Id 身份证号 姓名 性别
1 4534534 xx xx
id 手机号 套餐 金额
用户id+时间+随机数字… 345345 Xx xxx
唯一,不重复
非空,不能取null
自动生成索引
一般不使用业务数据作为主键
而是使用无意义数据
添加主键
在新建表时添加
create table tb2(
id int primary key,
…
);
create table tb2(
id int,
…,
primary key(id)
);
create table tb2(
name…,
ip…,
…,
primary key(name, ip) – 双主键(组合主键)
);
在修改表时添加
alter table tb2
add primary key(id);
查看主键
desc tb2;
show create table tb2\G
删除主键
alter table tb2
drop primary key;
自增主键
auto_increment
建表时添加自增主键:
id int primary key auto_increment
修改表将主键设置为自增(id已经是主键):
alter table tb2
modify id int auto_increment;
取消自增(不会删除主键约束)
alter table tb2
modify id int;
自增主键填入 null 值时,自动填入自增值
查看自增值的下一个值
show create table tb2\G
…
auto_increment: 54345
可以手动插入一个指定的值,如果这个值是表中的最大值,下一个自增值会自动从这个最大值增长
使用自增主键,不用管这个值是否连续
自增主键不能回退
查询刚插入的数据生成的主键值
使用函数: last_insert_id()
select last_insert_id();
Insert … values(…),(…),(…) ;
Select last_insert_id(); 得到第一条数据的 id
last_insert_id() 只获取当前数据库连接所插入的 id 值
使用示例:
Insert into xuesheng(name)
values(‘aaa’);
insert into lianxi(xs_id, tel)
values(last_insert_id(),‘236236643’);
外键约束
限制一个字段的取值,只能取另一个主键的值
创建外键
建表时创建外键
create table tb3(
…
x_id …
…
foreign key(x_id) references tb2(id)
);
修改表时创建外键(添加外键)
alter table tb3
add foreign key(x_id) referneces tb2(id);
查看外键
show create table tb3;
删除外键
首先需要查看外键约束的名字
alter table tb2
drop foreign key 约束名
外键也会自动创建索引,删除外键,不会自动删除外键的索引,如果想删除外键的索引:
alter table tb2
drop index 索引名
非空约束
添加非空约束
直接后面加not null
创建时添加
Create table tb2(
…
name varchar(20) not null,
…
);
修改时添加
Alter table tb2
Modify name varchar(20) not null;
查看非空约束
Desc tb2;
Show create table tb2\G
取消非空约束
Alter table tb2
Modify name varchar(20);
Alter table tb2
Modify name varchar(20) null;
唯一约束
字段取值不能重复,允许重复的 null 值
会生成索引
添加唯一约束
建表时添加
Create table tb2(
Username varchar(32) unique not null,
Email varchar(128) unique,
Addr varchar(255),
Tel varchar(20),
unique(addr, tel) – 字段组合不重复
);
修改表时添加
Alter table tb2
Modify email varchar(128) unique;
Alter table tb2
Add unique(addr, tel);
查看唯一约束
Desc tb2;
Show create table tb2;
– 查看系统库中的约束表
use information_schema; – 系统库,库信息
select * from table_constraints
where table_name=‘xuesheng’;
取消唯一约束
alter table tb2
drop index 索引名;
检查约束
通过设置字段取值条件,来限制它的取值
比如性别,年龄范围
Mysql支持检查约束的语法,但没有实现这个约束,mysql不会检查约束条件
Create table xuesheng(
Gender…
Age…
Check(gender=’男’ or gender=’女’),
Check(age>8 and age<60)
);
默认值
age int default 0
comment注释信息
Create table tb2(
Id int comment ‘主键id’,
Name varchar(20) comment ‘姓名’
);
Show create table tb2\G 可以看到注释
表之间的关系
一对一
具有唯一约束的外键
既是主键也是外键的字段
一对多
在多方表添加外键
多对多
需要一张中间表,添加两个外键字段,分别引用两张表的主键