MySQL(二)数据库表结构-数据类型

MySQL作为关系型数据库管理系统(RDBMS,Relational Database Management System)的典型代表,使用非常的广泛。关系型数据库的表结构和Excel的结构比较相似,由行和列(column)组成,在MySQL中,列的属性定义非常重要,即数据类型的定义,不同的数据类型大小不一,选择合适的数据类型对于数据库性能优化非常的重要,最近有一项工作就是对某一批用户测试结果的数据记录,本来是记录在文本中的,定期用shell脚本去查询统计就好了,但是最近准备深入学习下数据库相关的知识,就拿来练手,设计一个数据库表结构,把数据写入数据库,既做备份,也方便其他同事连接查询,多终端访问毕竟是数据库相较于文本的优势之一。

常用的数据类型大致可以分为数值、字符串和日期。

1.数值类型

2.日期和时间类型

时间的记录并不一定是以上的日期时间格式,例如zabbix的history表中的clock采用的是整数INT类型,用from_unixtime函数转化成时间进行显示,这里的int(11)中的11代表的显示宽度和int的长度/数值范围不冲突,大于数值范围就失效了,小于数值范围可以加UNSIGNED ZEROFILL属性补0显示,不加就不补0显示。

3.字符串类型

以上的三大类型数据,在确定输入数据的范围后尽可能取小一点的数据类型,小数能用单精度不要用双精度。

5.示例

一、新建数据库表

手头上有一批数据,包含【作业号,作业结束时间,用户名,作业名,A软件消耗机时,L软件消耗机时,两个软件计算结果最大偏差,最大偏差对应的点,准确度分级】,具体的属性设计我就不写了,我这边直接写出数据库表的创建语句

create database soft_test;
use soft_test;
create table history
(job_id int(7) primary key,
user_name varchar(20) not null,
job_name varchar(255) not null,
home_path varchar(255) not null,
end_time datetime not null,
softA_coretime float not null,
softB_coretime float not null,
max_diff_point int(5) not null,
max_diff_value float not null,
accuracy_level varchar(1) not null);

我用的是MySQL的版本是8.0.23,8.0.17版本之后int数据类型宽度设置就不再采用了,所以在create新表的时候int(4)这样的设置会出现warning,不影响使用,去掉宽度设置就不再有warning。columns的属性设置的格式是column_name+约束条件,上面的primary key和not null就是约束条件,在history表中job_id被设置为primary key(主键约束),当然也可以设置重复主键约束MUL,也可设置唯一主键约束UNI。

关于PRI、UNI和MUL,我可以简述一下我的理解,PRI的约束可以赋予不会出现重复数据列,或者赋予给多个列,这多个列组合起来不重复,比如学生成绩表(姓名+学号+成绩),姓名和成绩可能重复,姓名+成绩也可能重复,学号不会重复,给学号赋予PRI约束就可以实现行记录不会重复,也可以给学号赋予UNI唯一约束,也可以给姓名+学号赋予PRI,假设一定会出现完全相同的行数据,可以用MUL或者不设置约束,但是不设置主键约束会降低数据库的查询效率,这个看具体情况进行设置就行。以上理解也是综合了各种能查询到的信息,不是很专业,后续若有新的感悟再来更正,反正要设置主键,据说查询查的快,奈何我没有接触过传说中的超大型数据库,没有接触过数据库查询写入测试,也没有接触过高并发访问的场景。

二、修改数据库表

如果对创建的新表不满意,直接drop就可以了,drop操作风险比较大,尤其以下两个drop操作,没有备份不能恢复的。我们可以用alter进行表的重命名和表中列的add/drop/modify/change等操作,也可以用create操作来复制旧表。

drop database database_name
drop table table_name
alter table table_nameA rename table_nameB //表名重命名
rename table table_nameA to table_nameB //表名重命名
alter table table_name add column column_name 约束条件(varchar/int....) //表中加列
alter table table_name drop column column_name //删除表中列
alter table table_name modify column_name 约束条件 //modify只能修改列的属性,不能改名称
alter table table_name change column_nameA column_nameB 约束条件 //change既能修改列名称又能修改列属性
create table_nameNEW like table_nameOLD //复制表结构
insert into table_nameNEW select * from table_nameOLD //导入数据

三、插入数据

MySQL的常规操作包括增删查改insert/delete/select/update,这边插入数据用insert,后续再介绍update操作,如果一条一条insert语句输入执行,有点小崩溃,这里就要借助我擅长的工具了shell,数据都在文本中存着,用shell脚本插入即可,脚本贴在下面,有兴趣的可以根据自己的实际情况就行修改使用,有同事用python也写了一个脚本,也能实现数据的写入,对python很感兴趣,但是在工作中很少用得到,基本用shell能解决的我都写shell脚本,后续如果学会了再做分享吧。

#!/bin/bash
export IFS=',' //这个变量还是很不错的,设置分隔符,可以解决不同分隔符的文档分段的问题
while read end_time job_id user_name job_name softA_coretime softB_coretime max_diff_value max_diff_point accuracy_level home_path
do
        echo "use lyra;insert into history values ('$job_id','$user_name','$job_name','$home_path','$end_time','$softA_coretime','$softB_coretime','$max_diff_point','$max_diff_value','$accuracy_level')" | mysql -uroot -p'password'
done < result.txt

到此成功录入数据,因为我的数据是生产环境的数据,数据库是测试环境,网络不能互通,有点小尴尬,只能手动导数据了,后续我再模拟测试环境,把增量导入和crontab设置的操作补上。下一篇文章再介绍MySQL中占大头的SELECT操作吧。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇