MySQL數據庫約束你真的懂嗎?

??????今天給各位帶來的是關于數據庫約束方面的知識

清風的CSDN博客

😛😛😛希望我的文章能對你有所幫助,有不足的地方還請各位看官多多指教,大家一起學習交流!

動動你們發財的小手,點點關注點點贊!在此謝過啦!哈哈哈!😛😛😛

目錄

?一、NULL約束

二、UNIQUE約束?

?三、DEFAULT約束

四、PRIMARY KEY約束

五、FOREIGN KEY約束?

5.1 語法

5.2 案例代碼


?

?一、NULL約束

NOT NULL - 指示某列不能存儲 NULL 值。

現在我們創建一個student表:

 create table student(id int, name varchar(20));

?可以看到,當我們沒有進行約束的時候,id 和 name 都是可以為NULL的。

?當前這個表沒有任何的約束,所以在往表里插入NULL的時候也是可以的:

insert into student values (null, null);

那么,現在來修改一下這個student,給這個表加上NOT-NULL約束:

 create table student (id int not null,name varchar(20));

那么現在就可以看到兩個表的差別了,第二次創建的表,對于id這一列,是不允許為空的。

所以當我們在插入NULL的時候,有了NOT-NULL的約束,程序就不會正常運行了:

insert into student (null,null);

對于NULL約束,還是比較容易理解的。

二、UNIQUE約束?

UNIQUE - 保證某列的每行必須有唯一的值

?

現在還是創建一個student表,不加任何約束,并插入一個學號為 1 ,名字叫張三的記錄:
 create table student(id int, name varchar(20));insert into student values (1,'張三');

再把張三這條記錄插入進去:(程序不會報錯)

?此時我們創建studenet表時加入UNIQUE約束,并插入張三的記錄:

create table student (id int unique, name varchar(20));
insert into student values (1,'張三');

加入UNIQUE約束后,可以看到,id這一列的key是UNI(UNIQUE)的縮寫:

因此,加入UNIQUE 約束之后,后續進行插入/修改的時候,都會先進行查詢,看當前這個被約束的列的值是否已經存在。約束雖然能夠引入更多的檢查操作,也會增加系統的開銷。

?三、DEFAULT約束

DEFAULT - 規定沒有給列賦值時的默認值

進行指定列插入的時候,其他未被指定到的列就會被設成默認值。

?在這里我們還是以上面的student為例,重新創建student表并不加任何約束:

 create table student(id int, name varchar(20));

創建表的時候,我們并沒有加任何默認值約束,可以看到student表中的默認值為NULL。

當我們對student表進行指定列插入:

insert into student (id) values (1);
insert into student (name) values ('張三');

這里可以看到,進行指定列插入的時候,沒有被指定的列,默認就是為NULL。

此時我們給student表加上DEFAULT約束:

 create table student (id int default 0,name varchar(20) default '無名氏');

這樣一來,再次進行指定列插入的時候,沒有被指定的列就會被設定為創建表時候給的默認值。

四、PRIMARY KEY約束

PRIMARY KEY - NOT NULL UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標
識,有助于更容易更快速地找到表中的一個特定的記錄。其實就是主鍵,用來作為一個記錄的標識。
現在我們創建一個帶有PRIMARY KEY約束的student表:
 create table student (id int primary key,name varchar(20));

需要注意一下,一張表里面只能有一個PEIMARY KEY約束。(非空&唯一)

通常創建表的時候都會指定一個主鍵。除了上面基礎的使用之外,還有一種情況-聯合主鍵,它也是只有一個主鍵,但是這個主鍵是由多個列聯合構成的。這里不做贅述。

加入主鍵約束后,插入記錄的時候,主鍵的列是不能為空的:

其次,主鍵的列的值也是唯一的:
insert into student values (1,'張三');
insert into student values (1,'張三);
//再次插入和第一條同樣的記錄
insert into student values (1,'張三);

再次插入和第一條同樣的記錄,程序就會報錯,因為記錄重復。

五、FOREIGN KEY約束?

FOREIGN KEY - 保證一個表中的數據匹配另一個表中的值的參照完整性

5.1 語法

外鍵用于關聯其他表的 主鍵 唯一鍵:
foreign key (字段名) references 主表(列)

5.2 案例代碼

創建班級表:

 create table class (class_ID int, name varchar(20));

創建學生表:

create table student (id int, name varchar(20),class_Id int);

班級是要包含學生的,比如說班級現在有這樣幾個插入的數據:

insert into class values (1,'210701班'),(2,'210702班'),(3,'210703班');

現在,往學生表里面插入數據:
 insert into student values (1,'張三',1),(2,'李四',2),(3,'王五',100);

? ? ? ? 現在,王五這個同學,不在班級表中存在,因此,這是一個不太科學的數據。而引入外鍵約束,就是為了解決這個問題。也就是說,希望學生表中的class_ID 都在班級表中存在,此時就可以使用外鍵約束。

create table class (class_ID int primary key,name varchar(20));create table student (id int primary key, name varchar(20), class_ID int, foreign key (class_ID) references class(class_ID));

? ? ? ?前面說到的約束,都是在定義表的時候,哪一列需要約束,就創建到哪一列的后面。而外鍵約束,則是寫到最后。即把所有前面的列都定義好了之后,在最后通過FOREIGN KEY創建外鍵約束。

創建外鍵的時候,要指定三個信息:

  • 本表哪個列
  • 引用自哪個表(references)
  • 引用自另外一個表的哪個列

此時就要求,本表(student)中這個列的數據必須要在引用的另外一個表的對應列中存在,這個情況下,也可以認為,班級表約束了學生表。把這種約束其他表的表,稱為父表,而把學生表這種被約束的表,成為子表。

引入外鍵之后,就會在對應的父表中檢查子表插入的值是否在父表中存在,不存在就報錯。其實,外鍵約束是雙向的,父表約束子表,子表也會約束父表。比如:要想刪除父表的記錄,必須先刪除子表對應的數據,確保子表中沒有數據引用父表的記錄。


?好啦,今天的分享就到這里!之后,我會給大家分享一些復雜查詢,比如聯合查詢,聚合查詢,子查詢等。

🎉希望各位看官讀完文章后,能夠有所提升。

?創作不易,還希望各位大佬支持一下!

👍點贊,你的認可是我創作的動力!

?收藏,你的青睞是我努力的方向!

??評論:你的意見是我進步的財富!

?

?

?

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

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

相關文章

JMeter接口測試之文件上傳

最近用JMeter做接口測試,頻繁遇到了文件上傳的接口,與其他一般接口的處理方式不一樣,想著分享下,希望能給測試同學一點啟發。 文章將圍繞三個部分進行展開: 一、用戶場景 二、接口請求參數 三、JMeter腳本編寫步驟…

C語言每日一題(36)隊列實現棧功能

力扣 225 用隊列實現棧 題目描述 請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。 實現 MyStack 類: void push(int x) 將元素 x 壓入棧頂。int…

vue2系列 — 自定義指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定義指令的鉤子 bind&#xff1a; 當 v-XXX 指令綁定到節點上時 觸發inserted&#xff1a;被綁定元素插入父節點時調用update&#xff1a;所在組件的 VNode 更新…

使用nprogress實現請求進度條

一、安裝nprogress npm i nprogress 二、 在axios的請求攔截器中使用nprogress 如果對于axios的請求和響應攔截器的使用不了解的&#xff0c;可以看這篇文章&#xff1a; axios二次封裝配置請求攔截器和響應攔截器-CSDN博客 nprogress上有兩個有用的方法&#xff1a; star(…

OpenStack云計算平臺-Dashboard(圖形化)

目錄 一、安裝和配置 1、安全并配置組件 2、完成安裝 ?二、驗證操作 一、安裝和配置 1、安全并配置組件 安裝軟件包&#xff1a; yum install openstack-dashboard 編輯文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全國高校數據?

前言 Python是一門強大的編程語言&#xff0c;它可以用于爬取互聯網上的各種數據。在這篇文章中&#xff0c;我們將學習如何使用Python爬取全國高校數據&#xff0c;并使用代理IP進行爬取。 本文主要分為以下幾個部分&#xff1a; 數據來源及需求安裝依賴包及導入模塊爬取全…

關于禪道的安裝配置以及項目管理、團隊協同工作

目錄 一、禪道是什么&#xff1f; 二、特點和功能 三、安裝禪道 3.1 下載官網 3.2 版本考慮 3.3 禪道使用手冊參考 3.4 Windows端安裝禪道 四、啟動禪道 4.1 訪問禪道 四、禪道部分功能的使用 4.1 添加項目集 4.2 啟動/關閉項目 4.3 項目計劃儀表盤/階段目標/研發…

頭歌——操作系統實訓總結

死鎖 1、系統出現死鎖時一定同時保持了四個必要條件&#xff0c;對資源采用按序分配算法后可破壞的條件是&#xff08;A&#xff09;。 A、循環等待條件B、互斥條件C、占有并等待條件D、不可搶占條件 2、資源的靜態分配算法在解決死鎖問題中是用于&#xff08;B&#xff09;。 …

【圖論】關鍵路徑求法c++

代碼結構如下圖&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用來遞歸求解拓撲排序&#xff0c;topologicalSort(float**, int*&, int, int, int)傳參圖的鄰接矩陣mat與結點個數n&#xff0c;與一個引用變量數組topo&#xff0c;返回一個布爾值…

代碼隨想錄-刷題第五天

鏈表題目總結 鏈表基本操作 對鏈表進行增刪改查等基本操作。注意&#xff0c;很多鏈表的題目使用虛擬頭結點操作起來會更加方便。每次對應頭結點的情況都要單獨處理&#xff0c;所以使用虛擬頭結點的技巧&#xff0c;就可以解決這個問題。 反轉鏈表 可以使用頭插法&#xf…

Shopee本土號封號幾率大嗎?如何避免封號?被封號了怎么辦?

Shopee是近幾年熱門的電商平臺之一&#xff0c;即使越來越多的跨境電商涌現&#xff0c;他的地位在東南亞市場依然占據一席之地&#xff0c;也依舊吸引著需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被關停之后&#xff0c;留下了大片空白&#xff0c;Shope…

CF 1890A Doremy‘s Paint 3 學習筆記 map的使用

原題 A. Doremys Paint 3 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output An array &#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45b;&#xfffd;1,&#xfffd;2,…,&#xfffd;&a…

跨境電商必須要海外代理IP嗎?盤點五大海外代理IP

相信跨境電商人近日都為了2023的跨境黑五旺季奮戰&#xff0c;而2024也即將來臨&#xff0c;對于跨境人的考驗一波接著一波&#xff0c;根據Adobe Analytics的數據&#xff0c;2022年黑色星期五的銷售額創下91.2億美元新高&#xff0c;網絡星期的銷售額同樣達到創紀錄的113億美…

『 C++類與對象 』多態之單繼承與多繼承的虛函數表

文章目錄 &#x1fae7; 前言&#x1fae7; 查看虛表&#x1fae7; 單繼承下的虛函數表&#x1fae7; 多繼承下的虛函數表 &#x1fae7; 前言 多態是一種基于繼承關系的語法,既然涉及到繼承,而繼承的方式有多種: 單繼承多繼承棱形繼承棱形虛擬繼承 不同的繼承方式其虛表的形…

ToDesk提示通道限制 - 解決方案

問題 使用ToDesk進行遠程控制時&#xff0c;免費個人賬號最多支持1個設備同時發起遠控&#xff0c;若使用此賬號同時在2個設備發起遠控&#xff0c;則會提示通道限制&#xff0c;如下圖&#xff1a; 解決方案 方案1&#xff1a;斷開其它遠控 出現通道限制彈窗時&#xff0…

數據結構(超詳細講解!!)第二十四節 二叉樹(下)

1.遍歷二叉樹 在二叉樹的一些應用中&#xff0c;常常要求在樹中查找具有某種特征的結點&#xff0c;或者對樹中全部結點逐一進行某種處理。這就引入了遍歷二叉樹的問題&#xff0c;即如何按某條搜索路徑訪問樹中的每一個結點&#xff0c;使得每一個結點僅且僅被訪問一次。 …

python3實現tailf命令

由于windows上面沒有類似linux上面的tailf命令&#xff0c;所以下面的python腳本來代替其能力。 tailf.py import re import timeimport os import argparsedef follow(thefile):thefile.seek(0, os.SEEK_END)while True:_line thefile.readline()if not _line:time.sleep(0…

RabbitMQ 搭建和工作模式

MQ基本概念 1. MQ概述 MQ全稱 Message Queue&#xff08;[kju?]&#xff09;&#xff08;消息隊列&#xff09;&#xff0c;是在消息的傳輸過程中保存消息的容器。多用于分布式系統之間進行通信。 &#xff08;隊列是一種容器&#xff0c;用于存放數據的都是容器&#xff0…

docker部署微服務

目錄 docker操作命令 鏡像操作命令 拉取鏡像 導出鏡像 刪除鏡像 加載鏡像 推送鏡像 部署 pom文件加上 在每個模塊根目錄加上DockerFile文件 項目根目錄加上docker-compose.yml文件 打包&#xff0c;clean&#xff0c;package 服務器上新建文件夾 測試docker-compo…