MySQL (一):數據類型,完整性約束和表間關系

在當今數據驅動的時代,數據庫作為數據存儲與管理的核心工具,其重要性不言而喻。MySQL 作為一款廣泛應用的開源數據庫,憑借其高性能、高可靠性和豐富的功能,深受開發者喜愛。本文作為 MySQL 系列博客的開篇,將帶你深入了解 MySQL 的基礎概念、數據類型、完整性約束以及表間關系。

一、MySQL 介紹

1.1 關系型數據庫概述

關系型數據庫是基于關系模型建立的數據庫,以行和列的形式存儲數據,通過表格之間的關聯來表達數據之間的關系。常見的關系型數據庫有 SQL Server、Oracle、DB2、MariaDB 等。以安卓系統中的 SQLite 為例,它是一款進程內數據庫,常用于移動端應用的本地數據存儲,輕量級且易于集成。

與關系型數據庫相對的是非關系型數據庫,例如鍵值(k-v)存儲的 Nosql、Redis,以及列式數據庫 HBase 等。非關系型數據庫在處理海量非結構化或半結構化數據時表現出色,而關系型數據庫則在處理結構化數據、保證數據的一致性和完整性方面具有優勢。

1.2 MySQL 的獨特之處

MySQL 屬于 Oracle 旗下的開源數據庫,它區別于其他關系型數據庫的一個很大特點是支持插件式存儲引擎。這意味著開發者可以根據應用場景的不同,選擇最適合的存儲引擎。例如,InnoDB 引擎支持事務處理、外鍵約束,適合對數據完整性要求較高的應用;MyISAM 引擎則以其高性能的查詢和插入操作,適用于只讀或讀多寫少的場景。

MySQL 采用 C/S(客戶端 / 服務器)模型,在架構設計上,使用 I/O 復用結合可伸縮線程池(select + 線程池)的方式。由于數據庫操作涉及磁盤 I/O,在這種場景下,select 模型已經能夠滿足需求,沒必要使用 epoll。這種架構設計使得 MySQL 能夠高效地處理大量客戶端請求,保證系統的穩定性和性能。

1.3?MySQL 的安裝(ubuntu)

參考:【MySQL數據庫】Ubuntu下的mysql_ubuntu mysql-CSDN博客

二、MySQL 數據類型

數據庫操作中,磁盤 I/O 往往是最先遇到的性能瓶頸。MySQL 的數據類型定義了數據的大小范圍,合理選擇數據類型不僅能降低表占用的磁盤空間,還能減少磁盤 I/O 次數,提高訪問效率

2.1 整數類型

數據類型

字節

最小值(有符號)

最大值(有符號)

最小值(無符號)

最大值(無符號)

TINYINT

1

-128

127

0

255

SMALLINT

2

-32768

32767

0

65535

MEDIUMINT

3

-8388608

8388607

0

16777215

INT

4

-2147483648

2147483647

0

4294967295

BIGINT

8

-9223372036854775808

9223372036854775807

0

18446744073709551615

在定義整數類型時,需要注意一些細節。例如:

CREATE TABLE users(age INT(9) unsigned NOT NULL DEFAULT 0);

這里INT(9)中的9是數據顯示時的寬度,和字符類型不同,數值型數據大小和數據類型強相關,并不會因為括號內的數字而改變占用的內存空間。

2.2 字符串類型

數據類型

描述

最大長度

CHAR(M)

固定長度字符串,M字節

255 個字符

VARCHAR(M)

可變長度字符串

65535 個字符(受限于行的最大長度)

TEXT

文本字符串

65535 個字符

MEDIUMTEXT

中等長度文本字符串

16777215 個字符

LONGTEXT

長文本字符串

4294967295 個字符

假設我們要創建一個存儲用戶昵稱的表:

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL);

使用VARCHAR類型存儲用戶名,既能滿足可變長度的需求,又能節省存儲空間。

2.3 日期和時間類型

數據類型

描述

格式

DATE

日期值

YYYY-MM-DD

TIME

時間值或持續時間

HH:MM:SS

DATETIME

日期和時間組合

YYYY-MM-DD HH:MM:SS

TIMESTAMP

時間戳

YYYY-MM-DD HH:MM:SS

YEAR

年份值

YYYY 或 YY

例如,記錄用戶的注冊時間:

CREATE TABLE user_registrations (id INT AUTO_INCREMENT PRIMARY KEY,registration_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

TIMESTAMP類型會自動記錄插入數據時的時間,方便進行時間相關的統計和查詢。

2.4 enum 和 set

ENUM類型用于定義一個字符串對象,該對象只能從預定義的列表中選取一個值;SET類型同樣基于預定義的列表,但可以選取多個值。

CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY,size ENUM('S', 'M', 'L', 'XL'),colors SET('red', 'green', 'blue'));

在插入數據時,size字段只能是'S'、'M'、'L'、'XL'中的一個,而colors字段可以是'red'、'green'、'blue'的任意組合。

三、完整性約束

完整性約束用于確保數據庫中數據的準確性和一致性,在 MySQL 中,常見的完整性約束有以下幾種:

3.1 主鍵約束(PRIMARY KEY)

主鍵是表中的一列或多列組合,用于唯一標識表中的每一行記錄。一個表只能有一個主鍵,且主鍵值不能為 NULL,也不能重復。例如,創建一個存儲學生信息的表:

CREATE TABLE students (student_id INT PRIMARY KEY,student_name VARCHAR(50) NOT NULL,age INT);

這里student_id作為主鍵,能快速定位和區分每一位學生的記錄。

3.2 自增鍵約束(AUTO_INCREMENT)

自增鍵是一種特殊的主鍵,通常為整數類型,在插入新記錄時,其值會自動遞增。一般用于生成唯一的標識。如:

CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT);

每次向orders表插入新訂單時,order_id都會自動生成一個唯一的遞增數值。

3.3 唯一鍵約束(UNIQUE

唯一鍵約束保證表中指定列的值是唯一的,但可以有一個 NULL 值(如果允許 NULL)。例如,在用戶表中,用戶的郵箱地址應具有唯一性:

CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY,email VARCHAR(100) UNIQUE,username VARCHAR(50) NOT NULL);

這樣能避免不同用戶使用相同的郵箱進行注冊。

3.4 非空約束(NOT NULL

非空約束規定列中不允許出現 NULL 值。在定義表結構時,若某列數據必須存在,就可以使用非空約束。如:

CREATE TABLE employees (employee_id INT AUTO_INCREMENT PRIMARY KEY,employee_name VARCHAR(50) NOT NULL,department VARCHAR(50));

employee_name列必須有值,否則插入數據時會報錯。

3.5 默認值約束(DEFAULT

默認值約束為列指定一個默認值,當插入數據時若未指定該列的值,就會使用默認值。例如,記錄用戶注冊時間時,若不手動指定時間,就使用當前時間:

CREATE TABLE user_registrations (id INT AUTO_INCREMENT PRIMARY KEY,registration_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,user_id INT);

3.6 外鍵約束

外鍵用于建立表與表之間的關聯關系,確保數據的一致性和完整性。比如,有orders表和customers表,orders表中的customer_id需要關聯到customers表的主鍵customer_id:

CREATE TABLE customers (customer_id INT PRIMARY KEY,customer_name VARCHAR(50) NOT NULL);CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT,FOREIGN KEY (customer_id) REFERENCES customers(customer_id));

通過外鍵約束,能保證orders表中的customer_id在customers表中存在,避免出現無效的關聯數據。

但是由于數據庫需要進行磁盤I/O操作,導致數據庫往往是性能瓶頸所在,因此業務中邏輯相關操作往往交給業務層代碼實現,所以外鍵約束并不常用。(下文中外鍵約束僅用于理解表間關系)

四、表與表之間的關系

在設計數據庫時,表與表之間的關系建模是關鍵環節,直接影響數據的存儲效率、查詢性能以及數據完整性。常見的表間關系包括一對一、一對多和多對多。

(1) 一對一

一對一關系是指兩張表中的記錄通過特定字段形成一一對應的映射,通常用于將一張表中部分不常用或敏感字段拆分到另一張表,以減少主表冗余或滿足安全性需求。

案例:以電商系統中用戶信息表和用戶擴展信息表為例。用戶表存儲基礎登錄信息(如用戶名、密碼),擴展表存儲用戶詳細資料(如身份證號、收貨地址)。

-- 用戶基礎信息表CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(128) NOT NULL);-- 用戶擴展信息表CREATE TABLE user_extensions (extension_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT UNIQUE, -- 通過user_id建立一對一關聯id_card VARCHAR(18),shipping_address TEXT,FOREIGN KEY (user_id) REFERENCES users(user_id));

關系實現:通過在user_extensions表中設置user_id字段作為外鍵,并添加UNIQUE約束,確保每個user_id僅對應一條擴展記錄。當插入數據時,若user_extensions表中已存在某個user_id,則新記錄插入失敗,從而保證一對一關系的唯一性。

(2) 一對多

一對多關系是最常見的表間關系,指一張表(主表)的一條記錄對應另一張表(從表)的多條記錄。通常通過在從表中引入主表的主鍵作為外鍵實現關聯。

案例:以學校管理系統中的班級表和學生表為例,一個班級包含多名學生。

-- 班級表(主表)CREATE TABLE classes (class_id INT AUTO_INCREMENT PRIMARY KEY,class_name VARCHAR(20) NOT NULL,teacher VARCHAR(50));-- 學生表(從表)CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY,student_name VARCHAR(50) NOT NULL,age INT,class_id INT, -- 引入班級表的主鍵作為外鍵FOREIGN KEY (class_id) REFERENCES classes(class_id));

關系實現:在students表中通過class_id字段關聯classes表的class_id主鍵。插入學生記錄時,class_id必須是classes表中已存在的值,確保數據一致性。例如,查詢某個班級的所有學生時,可通過JOIN操作:

SELECT s.student_name, c.class_nameFROM students sJOIN classes c ON s.class_id = c.class_idWHERE c.class_name = '高三(1)班';
(3)多對多

多對多關系表示兩張表中的多條記錄可相互關聯,由于數據庫無法直接存儲這種關系,需引入中間表(也稱關聯表)進行建模。中間表包含兩張主表的主鍵字段,通過組合主鍵確保關系的唯一性。

案例:以圖書管理系統中的書籍表和讀者表為例,一本書可被多名讀者借閱,一個讀者可借閱多本書。

-- 書籍表CREATE TABLE books (book_id INT AUTO_INCREMENT PRIMARY KEY,book_title VARCHAR(100) NOT NULL,author VARCHAR(50));-- 讀者表CREATE TABLE readers (reader_id INT AUTO_INCREMENT PRIMARY KEY,reader_name VARCHAR(50) NOT NULL,contact VARCHAR(100));-- 中間表(借閱記錄表)CREATE TABLE borrow_records (book_id INT,reader_id INT,borrow_date DATE,return_date DATE,PRIMARY KEY (book_id, reader_id), -- 組合主鍵確保唯一性FOREIGN KEY (book_id) REFERENCES books(book_id),FOREIGN KEY (reader_id) REFERENCES readers(reader_id));

中間表設計要點

  1. 字段組成:包含關聯的兩張主表的主鍵字段(如book_id和reader_id),可按需添加其他屬性(如借閱時間、歸還時間)。
  2. 主鍵設置:使用組合主鍵(PRIMARY KEY (book_id, reader_id)),確保同一條書籍與讀者的關聯關系不會重復記錄。
  3. 外鍵約束:通過外鍵關聯主表主鍵,保證數據引用的完整性,例如刪除書籍時,可通過外鍵級聯操作同步刪除相關借閱記錄。

通過中間表,多對多關系被拆解為兩個一對多關系,既保證數據的完整性,又能靈活實現復雜查詢與業務邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86693.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86693.shtml

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

相關文章

【軟考高項論文】信息系統項目的資源管理

摘要 本文圍繞信息系統項目的資源管理展開論述。首先闡述了項目資源管理的基本過程,包括資源規劃、估算、獲取、配置、監控和釋放等關鍵步驟,并給出資源分解結構示例。接著結合2024年參與管理的某信息系統項目實際情況,詳細說明資源管理的具…

阿里云Ubuntu服務器上安裝MySQL并配置遠程連接

1. 安裝MySQL 首先連接到你的Ubuntu服務器,然后執行: # 更新軟件包列表 sudo apt update# 安裝MySQL服務器 sudo apt install mysql-server# 啟動MySQL服務 sudo systemctl start mysql# 設置MySQL開機自啟 sudo systemctl enable mysql# 檢查MySQL狀態…

STM32HAL 旋轉編碼器教程

配置時鐘編碼模式讀取方法: if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1) 0){count - __HAL_TIM_GET_COUNTER(&htim1);}else{count __HAL_TIM_GET_COUNTER(&htim1);}bsp_dtUInt32_show(count);__HAL_TIM_SET_COUNTER(&htim1, 0); 通過 __HAL_TIM…

激光束修復手機屏任意層不良區域,實現液晶線路激光修復原理

摘要 手機屏結構多層復合,任意層線路不良嚴重影響顯示質量。激光束憑借高能量密度與可調控性,能夠穿透不同介質精準作用于目標層。本文基于激光與多層材料相互作用機制,解析激光束對手機屏各層不良區域的修復原理,為全層液晶線路…

【軟件開發】架構與架構師

文章目錄 一、前言二、關于系統架構1. 保障用戶訪問速度2. 支持大規模并發請求3. 應對復雜業務邏輯4. 應對海量數據的存儲與讀寫三、關于系統架構師四、關于安全架構1. 產品安全架構2. 安全體系架構五、關于安全架構師一、前言 在系統建設與技術架構實踐不斷推進的背景下,關于…

Blender速成班-基礎篇2

視頻教程:【第一章】基礎操作_嗶哩嗶哩_bilibili 目錄 編輯模式 1.1側邊屬性 擠出選區——E 擠出方式選擇——AltE ?編輯 內插面——I 倒角——CtrlB 環切——CtrlR 旋繞 本片繼續基于視頻教程介紹Blender的一些基礎操作 勾選Cavity使物體邊線更清晰 編…

對象進階與擴展

目錄 創建對象 Object.create() 原型 原型操作 原型污染 對象屬性 屬性特征 枚舉屬性 Object.keys() Object.getOwnPropertyNames() Object.getOwnPropertyDescriptor() O…

理解圖像的隨機噪聲

圖像灰度信息很難精確測量,一般情況下測量值總在真實值附近晃動,使用概率模型可以對該隨機性建模,大致如下: 1 概率密度函數 1)隨機變量 x 的概率密度函數 p(x) 定義為:當 趨近于 0 時,在區間 上…

華為云鏡像倉庫下載 selenium/standalone-chrome 鏡像

你可以使用以下步驟從華為云鏡像倉庫下載 selenium/standalone-chrome 鏡像&#xff1a; 1. 登錄華為云鏡像倉庫&#xff08;如果需要認證&#xff09; bash sudo docker login -u <用戶名> -p <密碼> swr.cn-north-4.myhuaweicloud.com 如果沒有華為云賬號&…

Push-T, AloHa, Rlbench三個仿真環境信息

1.Push-T 很好兄弟&#xff0c;你問得很關鍵&#xff1a;你給我的三段代碼其實是一套完整的推理錄像 pipeline&#xff0c;它們之間既有獨立功能&#xff0c;又有順序依賴關系。我來幫你分段解釋&#xff0c;每段是什么功能、三段之間怎么配合&#xff0c;讓你徹底搞明白。 &a…

Linux信號機制:從入門到精通

嘿&#xff0c;小伙伴們&#xff01;今天我要和大家聊一個Linux系統中非常有趣又重要的話題——信號機制。別擔心&#xff0c;雖然信號聽起來有點高深&#xff0c;但我會用最通俗易懂的語言&#xff0c;配合清晰的圖表&#xff0c;帶你徹底搞懂這個概念&#xff01; 什么是信號…

Vue3項目引入高德地圖【超詳細教程】

前言 在 Vue 3 項目中集成高德地圖&#xff08;AMap&#xff09;是一個常見的需求。本文將詳細介紹如何在 Vue 3 項目中使用高德地圖&#xff0c;包括安裝配置、基本使用以及一些進階功能的實現。 一、環境準備 1.1 vue3項目初始化 步驟 1&#xff1a;初始化項目 npm crea…

blender mcp安裝(完全免費的ai建模)

1.最關鍵的一步&#xff0c;建議最早執行(就是安裝uvx) mac系統執行 brew install uvwindows執行 powershell -c "irm https://astral.sh/uv/install.ps1 | iex" 出現這一步就成功安裝uvx了&#xff0c;因為mcp需要使用uvx 2.第二步驟 github地址: https://gith…

GIS開發入門教程與筆記分享

大家好&#xff0c;我是地信小學生&#xff0c;距離5月3日發布暫停更新以來&#xff0c;也一兩個月啦&#xff0c;這期間也陸陸續續更新了點內容。 我自己寫的筆記主要是以入門筆記為主&#xff0c;真正的內容并不多&#xff0c;包括&#xff1a;GIS基礎、PostgreSQLPostGIS入門…

設計模式-代理模式、裝飾者模式

代理模式 Proxy&#xff08;代理&#xff09;—對象結構型模式定義&#xff1a;給某一個對象提供一個代理對象&#xff0c;并由代理對象控制原有對象的引用。 代理模式的核心思想是&#xff1a;創建一個代理對象&#xff0c;代理對象在調用目標方法時&#xff0c;可以插入額外…

國產安路FPGA純verilog視頻圖像去霧,基于暗通道先驗算法實現,提供5套TD工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目國產安路FPGA相關方案推薦本博主已有的圖像處理方案 3、設計思路框架工程設計原理框圖輸入Sensor之-->GC0308攝像頭輸入Sensor之-->OV7725攝像頭輸入Sensor之--…

Windows商店中的簡筆畫學習應用

此應用包含動物、植物、人物、交通工具、卡通等類別超過1500張線條圖片&#xff0c;支持圖片臨摹和圖片填色&#xff0c;可以將繪圖和填色結果保存成文件&#xff0c;也可以打開本地圖片進行臨摹和填色。 菜單說明 右側繪圖區上方菜單功能包括&#xff1a;打開文件&#xff1…

樹莓派4B --ubundu20.04 機載電腦配置WIFI熱點

不要用刷機過程配置WIFI賬號&#xff0c;因為在那里配置的WIFI都是不受控的&#xff0c;會出很多問題。 1.安裝網絡 sudo apt-get install network-manager 2.將源碼CLONE到本地 sudo git clone https://github.com/oblique/create_ap cd create_ap sudo make install 當你…

??JETSON NANO B01? 在AIOT 的領域的作用

低功耗邊緣設備的理想選擇 &#x1f449; ??適合人群??&#xff1a;精打細算、小廠搞智能監控的 ??Jetson Nano B01??&#xff08;4GB內存/0.47TOPS算力&#xff09;&#xff0c;JetBot (NVIDIA社區版) 機器人/自動駕駛項目? ??硬件??&#xff1a;Jetson Nano B0…

Kioptrix Level2

靶機截圖 收集信息 主機發現 打開靶機后&#xff0c;用kali探測靶機的 IP arp-scan-l 可以用nmap進行同網段掃描探測存活ip nmap -sP 10.4.7.0/24 端口掃描 命令過程 nmap -sT -sV -p- -O 10.4.7.220 -sT&#xff1a;TCP連接掃描 -sV&#xff1a;服務版本探測 -p-&#x…