學習MySQL的第十天

一、MySQL的數據類型

1.MySQL的數據類型

?2.常見的數據類型的屬性

二、整數類型


三、浮點類型


????????REAL默認就是DOUBLE。如果你把SQL模式設定為啟用“REAL_AS_FLOAT”,那么,MySQL就認為REAL是FLOAT。如果要啟用“REAL_AS_FLOAT”,可以通過以下SQL語句實現:
????????SET sql_mode = "REAL_AS_FLOAT";

四、約束

4.1?為什么需要約束

????????數據完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability)。它是防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的,而約束就是為了保證數據的完整性
????????約束就是對表中字段的限制

實體完整性(Entity Integrity):例如,同一個表中,不能存在兩條完全相同無法區分的記錄

域完整性(Domain Integrity):例如:年齡范圍0-120,性別范圍“男/女”

引用完整性(Referential Integrity):例如:員工所在部門,在部門表中要能找到這個部門

用戶自定義完整性(User-defined Integrity):例如:用戶名唯一、密碼不能為空等,本部門經理的工資不得高于本部門職工的平均工資的5倍。

????????約束的分類:

1.從約束字段的字段的個數分為 ?單列約束和多列約束
2.約束的作用范圍分為 ?列級約束和表級約束
列級約束:將此約束聲明在對應字段的后面
表級約束:在表中所有字段

????????約束的作用:

NOT NULL 非空約束
UNIQUE 唯一性約束
PRIMARY KEY 主鍵約束
FOREIGN KEY 外鍵約束
CHECK 檢查約束
DEFAULT 默認值約束

????????添加約束的場景

?CREATE TABLE 時添加約束
?ALTER TABLE 時添加約束

????????如何查看表中的約束

SELECT * 
FROM information_schema.table_constraints # 數據庫內置的表
WHERE table_name = 'emp1';  # 之前的屬于固定查詢,這一句是進行匹配

4.2?非空約束

? ? ? ? 在創建表時添加約束

CREATE TABLE test1(
id INT NOT NULL,
name VARCHAR(255) NULL,
salary DECIMAL(10,2)
)

????????在 ALTER TABLE時添加約束

ALTER TABLE test1
MODIFY name VARCHAR(255) NOT NULL;

? ? ? ? 刪除非空約束

? ? ? ? 就相當于修改約束使其沒有限制

ALTER TABLE test1
MODIFY name VARCHAR(255) NOT NULL;

4.3?唯一約束性

????????UNIQUE 約束列中的內容不能重復

????????在創建時添加約束

CREATE TABLE test2(
id INT UNIQUE,  # 列級約束
name VARCHAR(255),
garden TINYINT,
# 表級約束
CONSTRAINT uk_test2_name UNIQUE(name)  # 或unique(name)
)

# 查看約束
SELECT * 
FROM information_schema.table_constraints # 數據庫內置的表
WHERE table_name = 'test2';

? ? ? ? 補充:
????????(1)表級約束:NOT NULL 沒有表級約束;CONSTRAINT 意思是 約束
? ? ? ? (2)在創建唯一約束的時候,如果不給唯一約束命名,就默認和列名相同
????????(3)可以向聲明unique的字段上添加NULL值,而且可以多次添加

????????在 ALTER TABLE時添加約束

ALTER TABLE test2
ADD CONSTRAINT new UNIQUE(name) # 對約束條件進行約束,并對約束進行命名
# ADD UNIQUE(name) 直接添加
# 或
/*
ALTER TABLE test2
MODIFY name VARCHAR(255) UNIQUE
*/SELECT * 
FROM information_schema.table_constraints # 數據庫內置的表
WHERE table_name = 'test2';

????????復合的唯一性約束

? ? ? ? 對于復合的唯一性約束,只要這兩個不完全相同即可

CREATE TABLE USER(
id INT,
name VARCHAR(255),
password VARCHAR(255),
# 表級約束
UNIQUE(name,password)
)# 例:
INSERT INTO USER
VALUES(1,'a','abc'),
(2,'b','abc')

????????刪除唯一性

? ? ? ? (1) 添加唯一性約束的列上也會自動創建唯一索引
? ? ? ? (2) 刪除唯一約束只能通過刪除唯一索引的方式刪除
? ? ? ? (3) 刪除時需要指定唯一索引名,唯一索引名就和唯一約束名一樣。
? ? ? ? (4) 如果創建唯一約束時未指定名稱,如果是單列,就默認和列名相同;如果是組合列,那么默認和()中排在第一個的列名相同,也可以自定義唯一約束名

4.4?主鍵約束

????????PRIMARY KEY? 這就好使主鍵不能為空,必須有值

????????在 CREATE TABLE 時添加約束

CREATE TABLE test3(
id INT PRIMARY KEY,
name VARCHAR(255),
salary DECIMAL(10,2),
email VARCHAR(255)
);
# 或
CREATE TABLE test5(
id INT,
name VARCHAR(255),
PRIMARY KEY(id)
);SELECT * 
FROM information_schema.table_constraints # 數據庫內置的表
WHERE table_name = 'test5';

????????在 ALTER TABLE 時添加約束

? ? ? ? 此時只能是在這個表沒有主鍵約束時才可以

ALTER TABLE test5
ADD PRIMARY KEY (id)

????????刪除主鍵約束

????????因為一個表只有一個主鍵,所以刪除時,不需要指定名稱,所以刪除很好進行

ALTER TABLE test5
DROP PRIMARY KEY

五、自增變量的持久化

? ? ? ? 自增列:

? ? ? ? 首先我們要引入自增列的概念,就比如學號列,如果你設置為了自增列,那么每增加一個學生,它就會自動向后順延一個學號

CREATE TABLE test7(
id INT auto_increment PRIMARY KEY,  # 創建一個自增列
name VARCHAR(255) UNIQUE 
)
SELECT *FROM test7;
INSERT INTO test7(name)
VALUES('Tom'),('Mike')
SELECT *FROM test7;
INSERT INTO test7
VALUES(NULL,'people')
SELECT *FROM test7;

? ? ? ? 補充:

? ? ? ? (1)當我們沒有指明字段就進行添加時,含有auto_increment的列會自己進行自增;
? ? ? ? (2)當我們向含有auto_increment的字段添加0或null時,也會自動進行自增

? ? ? ? 隨后我們通過一個主表和從表來展現一下基本操作

外鍵約束
在create table 時添加
# 主表和從表:父表和子表
先創建主表
CREATE TABLE deep(
id INT,
name VARCHAR(155)
);
創建從表
CREATE TABLE dee(
dee_id INT PRIMARY KEY auto_increment,
dee_name VARCHAR(155),
department_id INT,
# 表級約束
FOREIGN KEY(dee_id) REFERENCES deep(id)
);
# 需要注意的是主表中的id也需要有主鍵約束或唯一性約束,才能與從表建立聯系
ALTER TABLE deep
ADD PRIMARY KEY (id);

? ? ? ? 我們再來了解一下約束的等級

????????cascade方式:在父表上更新刪除記錄,同步更新刪除子表的匹配記錄
????????Set null模式:父表上已經更新或刪除記錄時,將子表上匹配記錄的列的位置設為null
????????no action方式:如果子表中有匹配記錄,則不允許對主表進行更新刪除操作
????????restrict方式:如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行更新刪除操作
????????restrict方式:同no action
????????set default方式:父表有變更時,子表相應的設置成一個默認的值,但是lnnodb不能識別

????????隨后我們以ON UPDATE CASCADE ON DELETE SET NULL來進行一次演示:

先創建主表
CREATE TABLE dept(
id INT PRIMARY KEY,
name VARCHAR(155)
);
創建從表
CREATE TABLE de(
de_id INT PRIMARY KEY auto_increment,
de_name VARCHAR(155),
department_id INT,
# 表級約束
FOREIGN KEY(department_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE SET NULL
# 把修改操作設置為級聯修改等級,把刪除操作設置為set null等級
# 注意:不能將不能為空的列作為修改對象
);INSERT INTO dept
VALUES(1001,'教學部'),
(1002,'學習部'),
(1003,'公關部')INSERT INTO de
VALUES(1,'張三',1001),
(2,'李四',1001),
(3,'王五',1003),
(4,'爾瑪',1002)
dept
de

????????我們先建立起主表與從表的聯系,然后對主表進行修改,觀察從表的變化

UPDATE dept 
SET id = 1004
WHERE id = 1002
SELECT * 
FROM de,dept
where de.department_id = dept.id
dept
de

? ? ? ? 當我們修改主表時,從表中與之關聯的列也同步發生變化

DELETE FROM dept
WHERE id = 1002

????????此時爾瑪的department_id 為null

? ? ? ? 最后我們還需要注意刪除外鍵約束,因為在當初建立約束時,就自動產生了約束索引

? ? ? ? 不過我們還需要注意:由于在當初建表的時候,沒有為這個外鍵約束起一個名稱,所以 MySQL 為此自動生成了一個名稱,這個自動生成的名稱不同于受到這個外鍵約束的列名。而刪除外鍵的時候,需要提供的是這個外鍵約束名,而不是列名,所以需要先查找出外鍵的名稱,然后才能將其刪除

? ? ? ? 為了查看外鍵的名稱,我們需要用到??show create TABLE de,并將其復制出來

CREATE TABLE `de` (`de_id` int NOT NULL AUTO_INCREMENT,`de_name` varchar(155) DEFAULT NULL,`department_id` int DEFAULT NULL,PRIMARY KEY (`de_id`),KEY `department_id` (`department_id`),CONSTRAINT `de_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `dept` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

? ? ? ? ?我們可以看到外鍵的名稱:CONSTRAINT `de_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `dept` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
? ? ? ? 被命名為了?de_ibfk_1 ,因此我們刪除時也要通過這個進行刪除

# 刪除外鍵約束
ALTER TABLE de
DROP FOREIGN KEY de_ibfk_1
# 檢查刪除的外鍵約束是否有對應的普通索引
SHOW INDEX FROM de # 通過這一步找到Column_name 中,對應的我們所刪除的字段名稱
# 刪除索引
ALTER TABLE de
DROP INDEX department_id # key name即外鍵的約束名

? ? ? ? 從而實現對外鍵及其索引的完整性刪除

六、結語

? ? ? ? 永遠相信自己;一往無前,風雨無阻

須知少日拏云志,曾許人間第一流。我們還年輕,我們還有無限可能!

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

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

相關文章

ubuntu24.04上使用qemu+buildroot+uboot+linux+tftp+nfs模擬搭建vexpress-ca9嵌入式linux開發環境

1 準備工作 1.1 安裝依賴工具 sudo apt-get update && sudo apt-get install build-essential git bc flex libncurses5-dev libssl-dev device-tree-compiler1.2 安裝arm交叉編譯工具鏈 sudo apt install gcc-arm-linux-gnueabihf安裝之后,在終端輸入ar…

ubuntu 22.04 使用ssh-keygen創建ssh互信賬戶

現有兩臺ubuntu 22.04服務器,ip分別為192.168.66.88和192.168.88.66。需要將兩臺服務器創建新用戶并將新用戶做互信。 創建賬戶 adduser user1 # 如果此用戶不想使用密碼,直接一直回車就行,創建的用戶是沒法使用用戶密碼進行登陸的 su - …

【PCIE配置空間】

1 PCIE配置空間 1.1 軟件如何知道PCIE設備是Swith,RC還是EP? –軟件通過讀取寄存器信息。 PCIE配置空間? PCIE寄存器;--PCIE配置協議規定必須實現的空間。--PCIE存在兩種配置空間Type0/Type1;--Type0配置空間EP設備必須實現;-…

Android 熱點二維碼簡單示例

Android 熱點二維碼簡單示例 一、前言 Android 原生設置有熱點二維碼分享功能,有些系統應用也會有這個需求。 下面看看是如何實現的。 本文是一個比較簡單的內容。 二、熱點二維碼生成實現 1、效果 整個應用就一個普通的Activity,顯示一個按鈕和二維…

uv:重新定義Python開發效率的下一代工具鏈

在Python生態系統中,包管理和項目工具鏈的復雜性一直是開發者面臨的一大挑戰。從依賴管理、虛擬環境創建到多版本Python切換,傳統的工具鏈(如pip、virtualenv、poetry等)雖然功能強大,但操作繁瑣、性能不足的問題長期存…

T101D加固平板電腦:無人機地面站的高效智能控制核心

隨著無人機技術在應急救援、農業監測、軍事偵察等領域的廣泛應用,對地面控制設備的要求也日益提高。魯成偉業推出的T101D加固平板電腦憑借其高性能、強防護和專業化設計,成為無人機地面站的核心控制終端,為復雜環境下的作業提供了可靠支持。 …

Datawhale AI春訓營】AI + 新能源(發電功率預測)Task1

賽題鏈接 官網 新能源發電功率預測賽題進階方案 下面是ai給的一些建議 新能源發電功率預測賽題進階方案 一、時序特性深度挖掘 1. 多尺度周期特征 # 分鐘級周期編碼 train[15min_index] (train[hour]*4 train[minute]//15)# 周周期特征 train[weekday] pd.to_datetime…

山東科技大學深度學習考試回憶

目錄 一、填空(五個空,十分) 二、選擇題(五個,十分) 三、判斷題(五個,五分) 四、論述題(四個,四十分) 五、計算題(二個&#xff…

Redis線上操作最佳實踐有哪些?

大家好,我是鋒哥。今天分享關于【Redis線上操作最佳實踐有哪些?】面試題。希望對大家有幫助; Redis線上操作最佳實踐有哪些? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在使用 Redis 時,尤其是在生產環境中,合理…

mac中的zip文件壓縮與壓縮文件中指定目錄刪除

問題 在使用mac的圖形界面壓縮文件后,往往那個壓縮文件中帶有__MACOSX文件,但是,這個文件夾又是我們不需要的目錄,所有,需要對mac圖形化界面壓縮后的文件目錄進行刪除,改如何做? 檢查壓縮文件…

【記錄】服務器用命令開啟端口號

這里記錄下如何在服務器上開啟適用于外界訪問的端口號。 方法 1 使用防火墻 1 su ,命令 輸入密碼 切換到root節點 2 開啟防火墻 systemctl start firewalld3 配置開放端口 firewall-cmd --zonepublic --add-port8282/tcp --permanent4 重啟防火墻 firewall-cmd…

深度學習-torch,全連接神經網路

3. 數據集加載案例 通過一些數據集的加載案例,真正了解數據類及數據加載器。 3.1 加載csv數據集 代碼參考如下 import torch from torch.utils.data import Dataset, DataLoader import pandas as pd ? ? class MyCsvDataset(Dataset):def __init__(self, fil…

C++/Python實現RGB和HSI相互轉換

1--C版本 #include <opencv2/opencv.hpp> #include <iostream> #include <cmath>// RGB to HSI cv::Vec3f RGBtoHSI(cv::Vec3b rgb) {float B rgb[0] / 255.0f;float G rgb[1] / 255.0f;float R rgb[2] / 255.0f;float num 0.5f * ((R - G) (R - B));f…

【Linux我做主】make和makefile自動化構建

make和makefile自動化構建 make和makefile自動化構建github地址前言背景介紹為什么需要make和makefile&#xff1f; make和makefile解析什么是make和makefile依賴關系和依賴方法核心語法結構簡單演示編譯清理 多階段編譯示例 make時執行的順序場景1&#xff1a;clean目標在前(特…

Qt 入門 5 之其他窗口部件

Qt 入門 5 之其他窗口部件 本文介紹的窗口部件直接或間接繼承自 QWidget 類詳細介紹其他部件的功能與使用方法 1. QFrame 類 QFrame類是帶有邊框的部件的基類。它的子類包括最常用的標簽部件QLabel另外還有 QLCDNumber、QSplitter,QStackedWidget,QToolBox 和 QAbstractScrol…

JAVA學習-多線程

線程 線程(Thread)是一個程序內部的一條執行流程。 程序中如果只有一條執行流程&#xff0c;那這個程序就是單線程的程序。 線程的常用方法及構造器&#xff1a; Thread提供的常用方法public void run() 線程的任務方法public void start() 啟動線程public String getName() …

Github 2025-04-19Rust開源項目日報 Top10

根據Github Trendings的統計,今日(2025-04-19統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Rust項目10Python項目1Rust: 構建可靠高效軟件的開源項目 創建周期:5064 天開發語言:Rust協議類型:OtherStar數量:92978 個Fork數量:12000…

OpenLayers:視圖變換的方法

一、什么是視圖變換&#xff1f; 視圖變換就是指視圖的 extent&#xff08;范圍&#xff09;、center&#xff08;中心點&#xff09;、zoom&#xff08;縮放級別&#xff09;、 resolution&#xff08;分辨率&#xff09;、rotation&#xff08;旋轉角&#xff09;等參數發生…

數字孿生火星探測車,星際探索可視化

運用圖撲構建數字孿生火星探測車&#xff0c;高精度還原外觀與內部構造。實時映射探測車在火星表面的移動、探測作業及設備狀態&#xff0c;助力科研人員遠程監測、分析數據&#xff0c;為火星探索任務提供可視化決策支持。

【NLP 66、實踐 ? 基于Agent + Prompt Engineering文章閱讀】

你用什么擦干我的眼淚 莎士比亞全集 工業紙巾 還是你同樣泛紅的眼睛 —— 4.19 一、?【核心函數】定義大模型調用函數 call_large_model prompt&#xff1a;用戶傳入的提示詞&#xff08;如 “請分析這篇作文的主題”&#xff09;&#xff0c;指導模型執行任務 client&…