MySQL 表的基本操作,结合项目的表自动初始化来讲

news2024/11/14 21:53:37

有了数据库以后,我们就可以在数据库中对表进行增删改查了,这也就意味着,一名真正的 CRUD Boy 即将到来(😁)。

查表

查看当前数据库中所有的表,使用 show tables; 命令

由于当前数据库中还没有表,所以输出 Empty set

不指定数据库

在操作表之前,可以通过 use 数据库名; 命令,指定要操作的数据库。

那假如不指定数据库的话,我们可以通过 show tables from test 的方式,来指定要操作的表,例如:

建表

既然没有表,那我们就创建一张表吧。创建表的语法如下:

create table 表名(

列名1 数据类型1,

列名2 数据类型2,

...

列名n 数据类型n

);

例如,我们创建一张文章表,表中包含文章的标题、内容、作者、发布时间、阅读量等信息,那么可以这样创建:

create table article(

id int primary key auto_increment,

title varchar(100) not null,

content text not null,

author varchar(20) not null,

create_time datetime not null,

read_count int default 0

);
  1. article 是表名;
  2. id 是主键,类型为 int,自增长;
  3. title 是标题,类型为 varchar,长度为 100,不允许为空;
  4. content 是内容,类型为 text,不允许为空;
  5. author 是作者,类型为 varchar,长度为 20,不允许为空;
  6. create_time 是发布时间,类型为 datetime,不允许为空;
  7. read_count 是阅读量,类型为 int,默认值为 0。

当然了,实际工作中,我们可能不会直接通过 SQL 语句来创建表,而是通过一些建表的工具,比如说 Navicat、DataGrip 等。以及 PowerDesigner、chiner 这种建模工具,关于工具的使用.

给表添加注释

在建表的时候,我们可以给表添加注释,语法如下:

create table 表名(

列名1 数据类型1 comment '注释1',

列名2 数据类型2 comment '注释2',

...

列名n 数据类型n comment '注释n'

) comment '表注释';

这样方便我们在后期维护的时候,能够更好的理解表的含义。

我们来一个简单的例子,在之前的基础上增加了一些字段的注释和表注释:

create table article(
    id int primary key auto_increment comment '主键',
    title varchar(100) not null comment '标题',
    content text not null comment '内容',
    author varchar(20) not null comment '作者',
    create_time datetime not null comment '发布时间',
    read_count int default 0 comment '阅读量'
) comment '文章表';

假如表已经存在

由于之前 article 表已经创建了,这时候再执行上述语句,就会报错 Table 'article' already exists

为了避免这种情况,我们可以在建表的时候,先判断表是否存在,如果不存在,再创建表,语法如下:

create table if not exists 表名(

列名1 数据类型1,

列名2 数据类型2,

...

列名n 数据类型n

);

实际的例子如下所示:

create table if not exists article(

id int primary key auto_increment comment '主键',

title varchar(100) not null comment '标题',

content text not null comment '内容',

author varchar(20) not null comment '作者',

create_time datetime not null comment '发布时间',

read_count int default 0 comment '阅读量'

) comment '文章表';

删表

删除表的语法如下:

drop table 表名;

同样的,在删表的时候尽量眨眨眼😂,看看自己是不是被坏人给控制了,否则又是“删库跑路”的悲剧。

同样,在删除表的时候也可以加上 if exists,语法如下:

drop table if exists 表名;

这样可以防止表不存在的时候,报错。

查看表结构

有时候,我们想知道表的结构是什么样的,也就是 create table 的时候包含了哪些列、列有哪些属性,那这时候我们可以使用以下这些命令查看:

  1. desc 表名;
  2. describe 表名;
  3. explain 表名;
  4. show columns from 表名;
  5. show fields from 表名;

结果都是一样的,大家可以根据自己的喜好,记住其中的一个就行了。

还有一个命令 show create table 表名;,可以查看建表语句。

关于表的数据类型,比如说 int、varchar、datetime 等,这些我们会留到后面的章节来讲。

那假如没有使用 use 数据库名; 命令指定要操作的数据库,那我们可以通过 show columns from 数据库名.表名; 的方式,来查看表的结构,例如:

show create table test.article;

; 结尾查询到的信息格式比较乱,可以通过  \G 来格式化输出,例如:

改表

通常来说,创建表之前就要做好充分的设计,尽量增加一些冗余字段来应对未来的需求变更,这样整个程序的改动量是最小的,也不容易出现 bug。

因为改动表的结构,就意味着对应的 SQL 语句要改、程序的逻辑代码要改、测试用例要改,很容易出现遗漏,导致程序出现意料之外的 bug。

所以,该表操作一定要慎重。

但又不能过度设计表,因为过度设计会导致表结构过于复杂,增加了维护成本,而且也不利于后期的扩展。

所以,改表操作也是一门学问。

增加字段

通常来说,增加字段是改表操作中最常见的操作,语法如下:

alter table 表名 add 列名 数据类型;

例如,我们要给 article 表增加一个 update_time 字段,类型为 datetime,那么可以这样写:

alter table article add update_time datetime;

增加字段的位置

在上面的例子中,我们给 article 表增加了一个 update_time 字段,但是这个字段是添加到了最后,如果我们想要添加到某个字段的前面,那么可以这样写:

alter table article add update_time datetime after create_time;

删除字段

删除字段的语法如下:

alter table 表名 drop 列名;

例如,我们要删除 article 表中的 update_time 字段,那么可以这样写:

alter table article drop update_time;

修改字段

修改字段发生的频率其实很低,毕竟设计的时候,都是经过深思熟虑的,但是有时候,也会因为一些原因,需要修改字段,比如说字段类型、字段长度等。

修改字段的语法如下:

alter table 表名 modify 列名 数据类型;

例如,我们要修改 article 表中的 title 字段,将类型从 varchar(100) 修改为 varchar(200),那么可以这样写:

alter table article modify title varchar(200);

需要注意的是,如果表中已经存在数据了,那么修改表的时候就要格外注意,比如说原来的 title 字段的长度是 100,现在修改为 10,那么就容纳不下原来的数据了,这时候就会报错。

我们留到数据插入的时候再来演示。

修改字段名

有时候,可能我们设计表字段的时候犯了蠢,字段名起的不太好,这时候就需要修改字段名了。修改字段名的语法如下:

alter table 表名 change 原列名 新列名 数据类型;

例如,我们要修改 article 表中的 title 字段名为 article_title,那么可以这样写:

alter table article change title article_title varchar(100);

修改表名

同样的,当我们需要修改表名时,可这么做:

alter table 原表名 rename 新表名;

例如,我们要将 article 表名修改为 article_info,那么可以这样写:

alter table article rename article_info;

技术派的表设计

整个库表的设计,首先要先厘清楚业务和需求,然后再进行设计,这样才能做到合理、高效。

技术派是如何初始化表的?

技术派的表初始化是借助 Liquibase 来实现的。

Liquibase 提供了一种结构化和系统化的方法来管理数据库架构的更改。它通过变更日志和变更集来控制数据库的状态变化,确保了数据库架构变更的可追溯性、可重复性和一致性,同时也支持跨团队的协作。适用于持续集成和持续部署的环境。

第一,在不使用 liquibase 的情况下,实现表的初始化。

@Slf4jpublic class ForumDataSourceInitializerTest extends BasicTest {
    @Value("classpath:liquibase/data/init_schema_221209.sql")
    private Resource schemaSql;
    @Value("classpath:liquibase/data/init_data_221209.sql")
    private Resource initData;

    @Testpublic void dataSourceInitializer() throws SQLException {
        DataSource dataSource = createCustomDataSource();
        //getMetaData():数据库元数据
        log.info(dataSource.getConnection().getMetaData().getURL());
        //初始化数据库连接池
        final DataSourceInitializer initializer = new DataSourceInitializer();
        // 设置数据源
        initializer.setDataSource(dataSource);
        initializer.setEnabled(true);
        //自动执行sql脚本
        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScript(schemaSql);
        populator.addScript(initData);
        //设置数据库填充器。
        initializer.setDatabasePopulator(populator);
        //初始化数据源。
        initializer.afterPropertiesSet();
    }

    private DataSource createCustomDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        //驱动器
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        //数据库url
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        //用户名
        dataSource.setUsername("root");
        //密码
        dataSource.setPassword("123456");
        return dataSource;
    }
}

这里简单解释一下大家可能比较陌生的代码:

①、通过 @Value 注解,将 init_schema_221209.sqlinit_data_221209.sql 文件加载到 Resource 对象中。

@Value("classpath:liquibase/data/init_schema_221209.sql")

private Resource schemaSql;

@Value("classpath:liquibase/data/init_data_221209.sql")

private Resource initData;

schema.sql 为表结构文件,data.sql 为表数据文件。

②、createCustomDataSource 方法用于创建数据源,这里使用的是 Spring 提供的 DriverManagerDataSource,当然了,也可以使用 DruidDataSource、HikariDataSource 等。


private DataSource createCustomDataSource() {

DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName("com.mysql.jdbc.Driver");

dataSource.setUrl("jdbc:mysql://localhost:3306/test");

dataSource.setUsername("root");

dataSource.setPassword("123456");

return dataSource;

}

③、ResourceDatabasePopulator 是用于填充数据库的工具类实现了 DatabasePopulator 接口。主要用于执行 SQL 脚本文件,这些文件可以包含创建表、插入数据等 SQL 命令,也就是前面提到的 schema.sql 和 data.sql。

final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();

populator.addScript(schemaSql);

populator.addScript(initData);

④、DataSourceInitializer 用于在应用程序启动时自动初始化数据库。通过执行 SQL 脚本来完成这项工作。

final DataSourceInitializer initializer = new DataSourceInitializer();
// 设置数据源
initializer.setDataSource(dataSource);
// 设置是否启用初始化
initializer.setEnabled(true);
// 设置填充数据库的工具类
initializer.setDatabasePopulator(populator);
// 执行初始化
initializer.afterPropertiesSet();

执行该测试类后,可以在控制台看到对应的日志信息。

然后通过 show tables; 命令,可以看到数据库中已经创建了对应的表。

小结

本篇我们主要讲解了 MySQL 表的基本操作,包括查表、建表、删表、查看表结构、改表等。

并结合技术派实战项目,讲解了如何在 Spring Boot 中初始化数据表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CrossOver2024电脑虚拟机软件详细介绍概述

CrossOver是由CodeWeavers开发的一款系统兼容软件,它能够在Mac和Linux操作系统上直接运行Windows应用程序,而无需创建或启动完整的Windows虚拟机。CrossOver通过模拟Windows应用程序所需的运行环境,实现了跨平台的无缝集成和高效运行。 Cross…

界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集,拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格,提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 上下文菜单允许开发者为应…

如何恢复edge的自动翻译功能

介绍:对于英文不好的小伙伴,把英语翻译成中文是有帮助的,而edge可以直接对英文页面翻译这一功能更是受人喜爱,但是,最近发现这一项功能消失了。 原始界面: 下面展示如何恢复该功能。 1.打开edge&#xff…

软考中级 软件设计师备考经验

考试介绍 软考中级的软件设计师需要考两个部分,选择题和大题,每科满分75,需要在同一次考试中两科同时大于等于45分才算通过。考试的内容包括计算机组成原理、数据结构、数据库、专业英语、信息安全、计算机网络等,范围比较广但考…

外卖店优先级

题目描述 ”饱了么”外卖系统中维护着N 家外卖店,编号1~N。每家外卖店都有一个优先级,初始时(0时刻)优先级都为0。 每经过1个时间单位,如果外卖店没有订单,则优先级会减少1,最低减到0;而如果外卖店有订单,则…

mysql8.0安装(zip版本)最详细

下载 https://dev.mysql.com/downloads/mysql/ 解压 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\Atools\mysql-8.0.30-winx64 # 切记此处一定要用双斜杠\\,单斜杠我这里会出错,不过看别人的教程,有的是单斜杠。自己…

Java基于SpringBoot的在线文档管理系统的设计与实现论文

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景,运用软件工程原理和开发方法&am…

基于springboot+vue的乐享田园系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

QT编写的程序需要打开远程主机的GUI的配置事项

1.首先通过输入指令进行远程登录: ssh -X 主机名主机地址或者ssh -Y 主机名主机地址 ​编辑 2.在远程主机上输入指令: env |grep DISPLAY ​编辑 3.得到DISPLAY参数值后进入到QT的RUN Environment参数配置栏配置如下图所示: ​编辑 在工具包的“运行”选项中,进…

现货商品国际挂牌撮合系统功能说明书

现货商品国际挂牌撮合系统功能说明书 一、系统概述 现货商品国际挂牌撮合系统是一个基于互联网技术的电子交易平台,旨在为全球现货商品买卖双方提供高效、透明、公正的撮合服务。该系统通过先进的撮合算法和交易规则,确保交易的快速匹配和成交&#xf…

基于pytorch实现手写数字识别

1,先安装pytorch,在pytorch环境中安装库: 1)进入所安装的pytorch环境,我的是pytorch 所以激活它: conda activate pytorch 2)使用pip安装numpy,torch,torchvision,matplotlib库 pip instal…

鸿蒙开发案例:进京赶考(4)

系列文章目录 鸿蒙开发案例:进京赶考(1) 鸿蒙开发案例:进京赶考(2) 鸿蒙开发案例:进京赶考(3) 鸿蒙开发案例:进京赶考(4) 案例介绍…

计算机服务器中了mallox勒索病毒怎么解密,mallox勒索病毒解密流程

科技技术的第一生产力,网络技术的不断发展与应用,让企业逐步走向数字化时代,通过网络的力量可以为企业更好地开展各项业务工作,网络数据安全问题也由此成为众多企业关心的主要话题。近日,云天数据恢复中心接到某化工集…

Python + Appium 自动化操作微信入门看这一篇就够了

Appium 是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium,能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令,…

5GC SBA架构

协议标准:Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择,根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…

Docker与虚拟机比较

在对比Docker和虚拟机前,先简单了解下虚拟化,明确Docker和虚拟机分别对应的虚拟化级别,然后对Docker和虚拟机进行比较。需要注意的是,Docker和虚拟机并没有什么可比性,而是Docker使用的容器技术和虚拟机使用的虚拟化技…

git介绍4.2

git(版本控制工具) 一、git 介绍 1、git是目前世界上最先进的分布式版本控制系统,可以有效,高速的处理从小到大的项目版本管理。 2、git是linux torvalds 为了帮助管理linux内核开发二开发的一个开放源码的版本控制软件。 3、git作用:更好…

【深度学习笔记】计算机视觉——图像增广

图像增广 sec_alexnet提到过大型数据集是成功应用深度神经网络的先决条件。 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。 此外,应用图像增广的原因是,随机改变训练样本可以…

Java宝典-类和对象

目录 1.面向对象1.1 面向过程与面向对象 2. 类的定义和使用2.1 如何定义类3.类的实例化4.this引用5.构造方法5.1 什么是构造方法5.2 构造方法的特点 6.包6.1 导包6.2 自定义包 7.封装8.访问限定符9.static9.1 static修饰的成员变量9.2 static修饰的成员方法 10.代码块10.1 普通…

大数据信用报告如何查询?有哪些需要注意的?

大数据信用对于有资金周转的人来说是比较重要的,主要由于大数据信用无形的被不少机构用于贷前风控,无论是机构要求的还是自查,提前了解大数据信用情况是常规操作,那大数据信用报告如何查询?有哪些需要注意的呢?本文详细为大家讲…