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

有了数据库以后,我们就可以在数据库中对表进行增删改查了,这也就意味着,一名真正的 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");//数据库urldataSource.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.mzph.cn/news/713349.shtml

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

相关文章

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2,将元素分为d1个组,每组相邻量取元素距离为d1,在各组内直接进行插入排序;取第二个整数d2 d1/2, 重复上述分组排序过程&#xff0…

CSS 自测题 -- 用 flex 布局绘制骰子(一、二、三【含斜三点】、四、五、六点)

一点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css flex布局-画骰子</title><sty…

Unity 切换场景

场景切换前必须要将场景拖动到Build中 同步加载场景 using System.Collections; using System.Collections.Generic; //using UnityEditor.SearchService; using UnityEngine; // 场景管理 需要导入该类 using UnityEngine.SceneManagement;public class c3 : MonoBehaviour {…

redis五大基础类型【重点】

之前写过一点小知识&#xff1a;https://blog.csdn.net/qq_45927881/article/details/134959181?spm1001.2014.3001.5501 参考链接 https://xiaolincoding.com/redis/data_struct/command.html#%E4%BB%8B%E7%BB%8D 目录 1. string&#xff08;字符串&#xff09;2. Hash&#…

MySql安全加固:配置不同用户不同账号禁止使用旧密码禁止MySql进程管理员权限

MySql安全加固&#xff1a;配置不同用户不同账号&禁止使用旧密码&禁止MySql进程管理员权限 1.1 检查是否配置不同用户不同账号1.2 检查是否禁止使用旧密码1.3 禁止MySql进程管理员权限 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496…

【c++】通讯录管理系统

1.系统功能介绍及展示 2.创建项目 3.菜单实现 4.退出功能实现 5.添加联系人—结构体设计 6.添加联系人—功能实现 7.显示联系人 8.删除练习人—检测联系人是否存在 9.删除联系人—功能实现 10.查找联系人 11.修改联系人 12.清空通讯录 #include <iostream> #include <…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

fly-barrage 前端弹幕库(3):滚动弹幕的设计与实现

项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感觉项目还不错的话&#xff0c;还请点下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…

显示器开机正常,插入HDMI线却不显示画面,换了HDMI线还是不行?

环境&#xff1a; 惠普/P24VG4 DELL笔记本 问题描述&#xff1a; 显示器开机正常&#xff0c;插入HDMI线却不显示画面&#xff0c;换了HDMI线还是不行&#xff0c;是不是显示器坏了&#xff1f; 解决方案&#xff1a; 1.前往显示器设置菜单里面查看input 2.把输入源默认设…

二百二十五、海豚调度器——用DolphinScheduler调度执行Flume数据采集任务

一、目的 数仓的数据源是Kafka&#xff0c;因此离线数仓需要用Flume采集Kafka中的数据到HDFS中 在实际项目中&#xff0c;不可能一直在Xshell中启动Flume任务&#xff0c;一是项目的Flume任务很多&#xff0c;二是一旦Xshell页面关闭Flume任务就会停止&#xff0c;这样非常不…

案例研究|DataEase助力众陶联应对产业链数据可视化挑战

佛山众陶联供应链服务有限公司&#xff08;以下简称为“众陶联”&#xff09;成立于2016年&#xff0c;是由34家陶瓷企业共同创办的建陶行业工业互联网平台&#xff0c;股东产值占整个行业的22.5%。众陶联以数据赋能为核心&#xff0c;积极探索新的交易和服务模式&#xff0c;构…

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版 带自动采集 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 包含火车头采集规则和模块&#xff0c;采集目标站非小号官网。 专业的数字货币大数据平台模板&#xff0c;采用帝国cms7.5内核仿制&#xff0…

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64&#xff08;1&#xff09;在开始栏中找到MSYS2 MINGW64并打开&#xff08;2&#xff09;安装git&#xff08;3&#xff09;安装make&#xff08;4&#xff09;安装好之后的文件…

Redis 之五:Redis 的主从复制

概念 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器都是主节…

云天励飞战略投资神州云海,布局机器人市场

日前,AI上市企业云天励飞(688343.SH)完成了对深圳市神州云海智能科技有限公司(以下简称“神州云海”)的B轮战略投资。 公开资料显示,自2015年于深圳创立以来,神州云海始终聚焦人工智能与服务机器人广阔的应用市场,依托自主的核心算法能力,深耕机器人硬件本体研发,整合上下游产…

RabbitMQ-TTL/死信队列/延迟队列高级特性

文章目录 TTL死信队列消息成为死信的三种情况队列如何绑定死信交换机 延迟队列RabbitMQ如何实现延迟队列 总结来源B站黑马程序员 TTL TTLTTL(Time To Live):存活时间/过期时间当信息到达存活时间后&#xff0c;还没有被消费&#xff0c;会被自动清除。RabbitMQ可以对消息设置过…

Win10系統如何重置系统

Win10系統如何重置 大家可以使用Win10內建的重設電腦設定&#xff0c;如以下操作&#xff1a; 首先&#xff0c;可以先到桌面左下角的【開始】 選擇【設定】 在【設定】裡找到【更新與安全性】 在左側欄有一項【復原】 在復原的標題下&#xff0c;副標題有一項【重設此電腦】…

【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;AcWing算法学习笔记 &#x1f4ac;总结&#xff1a;希望你看完…

​The Sandbox的南极之旅|链接世界:从南极洲到元宇宙

真正的发现之旅不在于寻找新的景观&#xff0c;而在于拥有新的眼光。 - 马塞尔-普鲁斯特 在这个数字世界和物理世界日益交织的时代&#xff0c;The Sandbox 的联合创始人 Arthur Madrid 和 Sebastien Borget 踏上了远离数字空间的旅程&#xff0c;前往地球上未被开发的宝藏地点…

无用工作、UBI与AI

有些隐晦和黑暗的事实无法陈述&#xff0c;因为任何的系统中“无用”的结局都是被无情的抛弃和淘汰&#xff0c;AI监督下的人类结局更是如此。 什么是无用工作&#xff1f; 无用无效工作通常指的是那些看似忙碌但实际上对社会或个人没有实质性贡献的工作。这类工作可能包括以下…