MySQL,如何建表,跟插入EXCEL数据透视表数据分析?

目录一、MySQL建表语句二、MySQL建表字符串类型设计1、CHAR2、VARCHAR3、枚举类型设计实战三、MySQL建表ID和金额的设计与实战1、ID自增的设计2、互联网企业金额字段设计原理四、...

一、mysql建表语句
二、MySQL建表字符串类型设计
三、MySQL建表ID和金额的设计与实战
2、互联网企业金额字段设计原理
四、MySQL建表时间类型设计与实战
五、MySQL高扩展jsON设计与实战

本文作为MySQL系列第三篇文章,详细讲解了MySQL的建表语句、以及表结构的设计规范和陷阱,对网络上常见的资料给出的设计方案,做了博主自己的理解和反驳。

一、MySQL建表语句

MySQL建表语句很简单,CREATE TABLE 表名 (),在其中设置表的列(属性)即可。

二、MySQL建表字符串类型设计

CHAR(N) 用来保存固定长度的字符(在Unicode字符集,Utf-8、Utf-16、Utf-32是这样的),N 的范围是 0 ~ 255,请牢记,N 表示的是字符,而不是字节。

在表结构设计中还需要额外定义建表对应的字符集。多字节字符集 (MBCS),通常指的是ANSI、中文编码以及Shift-jis,jis,euc-jp,euc-kr等。Unicode字符集,Unicode字符集即平常说的宽字节,包含Utf-8、Utf-16、Utf-32。

常见的字符集有 GBK、UTF8,通常推荐把默认字符集设置为 UTF8。

VARCHAR(N) 用来保存变长字符,N 的范围为 0 ~ 65536, N 表示字符。在超出 65536 个字符的情况下,可以考虑使用更大的字符类型 TEXT 或 BLOB,两者最大存储长度为 4G,其区别是 BLOB 没有字符集属性,纯属二进制存储。

随着移动互联网的飞速发展,推荐把 MySQL 的默认字符集设置为 UTF8MB4,否则,某些 emoji 表情字符无法在 UTF8 字符集下存储。

鉴于目前默认字符集推荐设置为 UTF8MB4,所以在表结构js设计时,可以把 CHAR 全部用 VARCHAR 替换,底层存储的本质实现一模一样。

设计表结构时,你会遇到一些固定选项值的字段。例如状态字段(***_state),有效的值为有限状态,例如01(订单初始状态)、02(下单成功)、03(支付中)……。

很多学习资料和博客推荐在 MySQL 8.0 版本之前,可以使用 ENUM 字符串枚举类型,只允许有限的定义值插入。如果将参数 SQL_MODE 设置为严格模式,插入非定义数据就会报错。

这里博主要跟这些资料唱个反调,我们在工程中的状态,基本都是我们手动set的,这里博主认为如果使用了 ENUM 字符串枚举类型恰恰不利于互联网的高速扩展的设计原则。

在这里我推荐在工程中维护一个 ENUM 枚举类,我们对数据库操作的的时候状态或者相关枚举类型的字段从枚举类中获取,这样方便维护,并且利于扩展。

三、MySQL建表ID和金额的设计与实战

进行实战设计之前,我们需要了解整型类型,

除了整型类型,数字类型还有浮点和高精度类型。MySQL 之前的版本中存在浮点类型 Float 和 Double,在真实的生产环境中不推荐使用,在计算时由于精度类型问题,会导致最终的计算结果出错。

ID一般我们会设置为自增,结合 auto_increment,可以jVwkM实现自增功能,但在表结构设计时用自增做主键一般只会使用 BIGINT 类型做主键。

原因有几点一是为了扩展性,int 的取值范围不一定适用互联网场景的增速,这里面需要注意MySQL 8.0 版本前自增不持久化,自增值可能会存在回溯问题,例如 1/2/3/4,我把4删点,再次插入的时候,主键ID还是 1/2/3/4,这就是回溯问题,解决办法就是在使用的时候评估这个方案会不会有影响,或者直接升级MySQL。

2、互联网企业金额字段设计原理

我们常常在其他博客看到这样一种说法“在海量互联网业务的设计标准中,并不推荐用 DECIMAL 类型,而是更推荐将 DECIMAL 转化为 整型 BIGINT类型。”,他给出的理由是所有金额相关字段都是定长字段,占用 8 个字节,存储高效。第二直接通过整型计算,效率更高。

而事实上真的是这样吗?

金额字段的取值范围如果用 DECIMAL 表示的,则定义为 DECIMAL(16,2) ,这样满足的万亿以上的场景了。

为什么我推荐使用DECIMAL而不是BIGINT,我们在存储金额的时候一般是分为单位,例如100,.00就是 1 元,当我们下单金额例如100元,我们的库里就会落 10000.00,但是这比订单购买了1个item商品3件sku,这100元就要分摊给这3件sku商品,这时候对于分摊的计算,在代码中int、long类型没有BigDecimal 计算的精准。

四、MySQL建表时间类型设计与实战

因为业务绝大部分场景都需要将日期精确到秒,所以在表结构设计中,常见使用的日期类型为DATETIME 和 TIMESTAMP。

4 个字节,因此其存储的时间上限只能到‘ 03:14:07’。

从 MySQL 5.6 版本开始,DATETIME 类型支持毫秒,DATETIME(N) 中的 N 表示毫秒的精度。例如,DATETIME(6) 表示可以存储 6 位的毫秒值。同时,DATETIME 不存在时区转化问题。一般是在国际化项目中,服务器端或者前端进行转换,这样查询或者变更效率更高。

每个表都要有一个时间字段, 在做表结构设计规范时,强烈建议你每张业务核心表都增加一个 DATETIME 类型的 last_modify_date 字段,并设置修改自动更新机制, 即便标识每条记录最后修改的时间。开发人员可以知道每次操作记录更新的时间,以便做后续的处理。

比如在电商的订单表中,可以方便对支付超时的订单做处理;在金融业务中,可以根据用户资金最后的修改时间做相应的资金轧差等。

五、MySQL高扩展JSON设计与实战

关系型的结构化存储存在一定的弊端,因为它需要预先定义好所有的列以及列对应的类型。但是业务在发展过程中,或许需要扩展单个列的描述功能。

这时,如果能用好 JSON 数据类型,那就能打通关系型和非关系型数据的存储之间的界限,为业务提供更好的架构选择。JSON 类型的另一个好处是无须预定义字段,字段可以无限扩展。

但是这里,博主并不推荐大家这么做,因为JSON类型及其难维护,并且写sql的时候很麻烦

我举个例子,我想插入一条信息,我需要

一般在生产中我们这样处理,在定义时,定义一个超大的字符串类型,在代码中使用JSON转换成一个JSON对象的字符串,保存。

本文作为MySQL系列第三篇文章,详细讲解了MySQL的建表语句、以及表结构的设计规范和陷阱,对网络上常见的资料给出的设计方案,做了博主自己的理解和反驳。

到此这篇关于MySQL中建表与常见的类型设计陷阱详解的文章就介绍到这了,更多相关MySQL建表 类型设计内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

}

持久层框架的特点和创建Mybatis工程

示例(用mybatis框架像数据库中插入一条数据)

解决因为端口号为1522或1521引发的IO错误,查看端口号

关于使用修改语句等时未提交事务后JDBC无法再修改这条数据这件事

当然了我就没这篇文章写得那么麻烦了,

一个简单的Mybatis示例:

在数据库中创建表stuinfo。

在工程中导入MyBatis框架包和数据库驱动包。

创建测试类,在main方法中进行测试。

导入MyBatis框架包和数据库驱动包:

Mybatis框架支持一个框架中使用多种不同的数据库,即在框架中同时使用两种以上的数据库,原则是需要用哪个数据库,就导入哪种数据库的jar包。

请在项目中导入Mybatis框架包和数据库驱动包。

为了简单起见,我们暂时将Mybatis的配置文件放在src目录下。

注意:当进行框架整合以后,这个文件可能会被删除掉。该文件名没有特殊要求。以下代码片段是框架对数据库连接字符串进行处理。

根据stuinfo表的字段创建一个javabean,该javabean的类名为Stuinfo,即表名首字母大写,驼峰式命名。

在前面创建的Stuinfo类所在的包中,继续创建映射文件,注意该文件的名字最好遵守项目团队制定的规范,例如规定该文件名是以被映射的java类名拼接上SqlMap.xml而成的。

对于映射文件,如果你不通过代码告诉Mybatis框架它在哪里,是没有办法读取到的,所以,我们还需要通过修改mybatis.xml文件告诉框架该如何找到映射文件。

工程的文件层次结构如下:

创建一个带有main方法的测试类,在方法中添加如下的代码:

比较我们以前写的JDBC代码和使用mybatis框架的代码,说说他们的差别。

搭建一个Mybatis框架项目,通过Mybatis框架查询出被连接数据库中某个表的所有数据。(使用oracle或者sqlserver试试)

Mybatis框架中有三种配置文件:

注意:在框架中,除了使用xml文件进行配置以外,还有一种配置文件也使用得很广泛,那就是properties文件。

1、JDBC:直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。

2、MANAGED:几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false。

environment元素的子元素dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源。通过它的type属性来指定内建的数据源类型,type属性包含三种配置:

UNPOOLED:实现每次被请求时简单打开和关闭连接。

POOLED:JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。当前Web应用程序用来快速响应请求很流行的方法。

JNDI:实现为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。

Mybatis:持久层框架,数据库框架。减少jdbc样板代码的编写。

"1、数据库驱动包(安装oracle数据库时就有了

2、将主配置文件mybatis.xml文件放到src目录下(主配置文件名不要改)

针对于每个表进行操作:

3、创建对应表的bean类

5、在主配置文件中注册映射文件

关于使用修改语句等时未提交事务后JDBC无法再修改这条数据这件事 START

}

我要回帖

更多关于 两个表格匹配相同数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信