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.pswp.cn/news/713349.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713349.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713349.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Python3的數據結構與算法 - 09 希爾排序

一、引入 希爾排序是一種分組插入排序的算法。 二、排序思路 首先取一個整數d1 n/2,將元素分為d1個組,每組相鄰量取元素距離為d1,在各組內直接進行插入排序;取第二個整數d2 d1/2, 重復上述分組排序過程&#xff0…

Angular 2 中的樣式綁定和 NgStyle

在 Angular 2 模板中綁定內聯樣式很容易。以下是一個綁定單個樣式值的示例&#xff1a; 你還可以指定單位&#xff0c;例如在這里我們將單位設置為 em&#xff0c;但也可以使用 px、% 或 rem&#xff1a; <p [style.font-size.em]"3">A paragraph at 3em! &l…

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…

vue3 滾動條觸底監聽

問題&#xff1a;指定區域內&#xff0c;顯示返回的數據&#xff0c;要求先顯示20條&#xff0c;區域超出部分滾動顯示&#xff0c;對滾動條進行監聽&#xff0c;滾動條觸底后&#xff0c;繼續顯示下20條... 解決過程&#xff1a; 1.在區域的div上&#xff0c;添加scroll事件…

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;構…

ant-design-vue如何限制圖片上傳的尺寸?

handleBeforeUpload(file, fileList) {// fileList 只包含了當次上傳的文件列表&#xff0c;不包含已上傳的文件列表// 所以長度要加上已上傳的文件列表的長度const isLimit this.fileList.length fileList.length > this.limit;const indexOfFile fileList.findIndex(it…

C++ STL 之容器 vector 常見用法

一. 什么是vector vector為“變長數組”&#xff0c;即長度根據需要而自動改變的數組。 頭文件&#xff1a; #include <vector>using namespace std;單獨定義一個vector&#xff1a;vector<typename> name&#xff0c;相當于一維數組 name[SIZE] &#xff0c;其長…

mac-docker-php容器連接mac中的pgsql數據庫失敗以及出現table_msg存錯誤時的解決方法

以php中的thinkphp 5.1為例&#xff0c;php容器連接mac中的pgsql數據庫失敗時&#xff0c;出現如下錯誤 [7] PDOException in Connection.php line 528 SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "localhost&…

Git 配置處理客戶端無法正常訪問到 github 原網站時,npm 下載依賴包失敗的問題

Git 配置處理客戶端無法正常訪問到 github 原網站時&#xff0c;npm 下載依賴包失敗的問題 使用 github 的鏡像網站地址或類似的替代產品地址&#xff0c;代替到 npm 拉取依賴包的 git 地址本地Git配置 例如&#xff1a;執行一下命令&#xff0c;則是以https://kgithub.com 替…

requests庫/urllib3庫返回WEB響應內容的處理差異

requests庫是一個廣泛使用的HTTP庫&#xff0c;用于發送HTTP請求和處理響應。 以下是requests庫中一些主要類和方法的詳細介紹&#xff1a;requests庫主要類和方法 類:requests.models.Response: status_code: 響應狀態碼。text: 以Unicode形式返回響應內容。content: 以字節形…

MySQL的主從同步原理

MySQL的主從同步&#xff08;也稱為復制&#xff09;是一種數據同步技術&#xff0c;用于將一個MySQL服務器&#xff08;主服務器&#xff09;上的數據和變更實時復制到另一個或多個MySQL服務器&#xff08;從服務器&#xff09;。這項技術支持數據備份、讀寫分離、故障恢復等多…

帝國cms7.5仿非小號區塊鏈門戶資訊網站源碼 帶手機版

帝國cms7.5仿非小號區塊鏈門戶資訊網站源碼 帶手機版 帶自動采集 開發環境&#xff1a;帝國cms 7.5 安裝環境&#xff1a;phpmysql 包含火車頭采集規則和模塊&#xff0c;采集目標站非小號官網。 專業的數字貨幣大數據平臺模板&#xff0c;采用帝國cms7.5內核仿制&#xff0…