【MySQL】表的約束——空屬性、默認值、列描述、zerofill、主鍵、自增長、唯一鍵、外鍵

文章目錄

  • MySQL
  • 表的約束
    • 1. 空屬性
    • 2. 默認值
    • 3. 列描述
    • 4. zerofill
    • 5. 主鍵
    • 6. 自增長
    • 7. 唯一鍵
    • 8. 外鍵

MySQL

在這里插入圖片描述

??

表的約束

??MySQL中的表的約束是一種規則,用于限制或保護表中數據的完整性和合法性。約束可以確保數據在插入、更新或刪除時滿足特定的條件,從而維護數據的正確性和一致性。

1. 空屬性

??兩個值:null(默認的)和not null(不為空)

??數據庫默認字段基本都是字段為空,但是實際開發時,盡可能保證字段不為空,因為數據為空沒辦法參與運算。

創建一個數據表其中的id1為NULL,id2為NOT NULL:

create table test1(id1 int null,id2 int not null);

在這里插入圖片描述
??

查看表中的結構:

desc test1;

在這里插入圖片描述

我們看到對于數據id1,是可以填寫NULL值的,而id2則無法填寫空值。

??

向test1插入不同的數據并且打印:

insert into test1(id1,id2) values(10,20); // 插入成功insert into test1(id2) values(20); // 插入成功,id1可以為空值insert into test1(id1) values(20); // 插入失敗,id2不可以是空值
//ERROR 1364 (HY000): Field 'id2' doesn't have a default value

在這里插入圖片描述

在這里插入圖片描述

??所以我們在設計數據庫表的時候,一定要在表中進行限制,滿足上面條件的數據就不能插入到表中。這就是“約束”。

??

2. 默認值

??默認值:某一種數據會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實數據的時候,用戶可以選擇性的使用默認值。

??注意:not null和defalut一般不需要同時出現,因為default本身有默認值,不會為空。

創建一個表,包含不能為空的姓名,默認值為0的年齡,默認值為男的性別:

mysql> create table test2(-> name varchar(20) not null,-> age tinyint unsigned default 0,-> sex char(2) default '男'-> );

在這里插入圖片描述
??

查看表中的結構:

desc test2;

在這里插入圖片描述

??可以看到我們的年齡和性別都成功的設置好了默認值0和男。當我們在插入數據的時候不給該字段賦值,就使用默認值。

??

向表中插入數據并打印:

mysql> insert into test2(name,age,sex) values('張三',18,'男');
mysql> insert into test2(name,age,sex) values('小紅',20,'女');
mysql> insert into test2(name,age) values('李四',22); // 只使用sex的默認值
mysql> insert into test2(name) values('王五'); // 只填了姓名,使用age和sex的默認值

在這里插入圖片描述

??

3. 列描述

??列描述:comment,沒有實際含義,專門用來描述字段,會根據表創建語句保存,用來給程序員或DBA來進行了解,類似注釋。

創建和上面類似的代碼同時加上列描述:

mysql> create table test3(-> name varchar(20) not null comment '姓名',-> age tinyint default 0 comment '年齡',-> sex char(2) default '男' comment '性別'-> );

??

此時不能desc查看到列描述,但是可以使用show操作:

desc test3;
show create table test3\G

在這里插入圖片描述

在這里插入圖片描述

??

4. zerofill

??zerofill:將自動為該列的值填充前導零,以確保該列的總寬度(包括符號位,如果有的話)與列定義中指定的顯示寬度相匹配,類似一種格式化輸出。

創建一張表,其中int類型a使用zerofill,而int類型b不加任何約束:

mysql> create table test4(-> a int(5) zerofill,-> b int(10)-> );

在這里插入圖片描述

??

查看表的結構:

desc test4;

在這里插入圖片描述

??

插入數據并且打印:

mysql> insert into test4(a,b) values(1,1);
mysql> insert into test4(a,b) values(10,20);
mysql> select * from test4;

在這里插入圖片描述

??

??int既然是四個字節,那是否int(10)和int(5)是一樣的呢?

??其實沒有zerofill這個屬性,括號內的數字是毫無意義的。這個數字并不代表該列可以存儲的最大整數值或存儲大小。相反,這個數字是所謂的“顯示寬度”(display width),它主要用于控制當查詢結果返回時該列的顯示寬度。

我們使用十六進制查看a的數值:

mysql> select a,hex(a) from test4;

在這里插入圖片描述

??所以可以看出數據庫內部存儲的還是1和10,00001和00010只是設置了zerofill屬性后的一種格式化輸出而已。

??

5. 主鍵

??主鍵:primary key用來唯一的約束該字段里面的數據,不能重復,不能為空,一張表中最多只能有一個主鍵;主鍵所在的列通常是整數類型。

創建一張表,其中包括int類型的id和varchar類型的name,其中id為主鍵:

mysql> create table test5(-> id int unsigned primary key,-> name varchar(20)-> );

在這里插入圖片描述

??

查看表結構:

desc test5;

在這里插入圖片描述

??其中id的Key就標記上了主鍵標志PRI。

??

向表中插入數據并且打印:

mysql> insert into test5 values(1,'張三');
mysql> insert into test5 values(2,'李四');
mysql> insert into test5 values(3,'王五');mysql> insert into test5 values(3,'趙六');
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'

在這里插入圖片描述

在這里插入圖片描述

??我們看到了當表中有id為3的數據時,此時在插入id=3的數據時就會直接報錯,這樣就很好的約束了我們表中由主鍵標記的數據是唯一的。

??

刪除主鍵(id):

mysql> alter table test5 drop primary key;

在這里插入圖片描述

??

如果創建的表中沒有主鍵,我們可以向某一個字段(這里向id)追加主鍵:

alter table test5 add primary key(id);

在這里插入圖片描述

??

上面,如果追加的字段有重復的字段,就無法繼續追加主鍵,需要刪除相同的字段:

??此時的表中有重復的id。

在這里插入圖片描述

??因為有重復的id,所以添加主鍵失敗。

在這里插入圖片描述

??刪除重復包含的id的數據。

在這里插入圖片描述

??再次插入主鍵成功。

在這里插入圖片描述

??

6. 自增長

??auto_increment:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值。通常和主鍵搭配使用,作為邏輯主鍵。

??自增長的特點:

??(1)任何一個字段要做自增長,前提是本身是一個索引(key一欄有值);

??(2)自增長字段必須是整數;

??(3)一張表最多只能有一個自增長。

??

創建一張表,其中的id為主鍵且自增長,name為varchar類型:

mysql> create table test6(-> id int primary key auto_increment,-> name varchar(10)-> );

在這里插入圖片描述

??

查看表結構:

desc test6;

在這里插入圖片描述

??

插入數據并且打印:

mysql> insert into test6 values(1,'張三');
mysql> insert into test6 values(2,'李四');
mysql> insert into test6(name) values('王五');mysql> select * from test6;

在這里插入圖片描述

??可以看到我們在沒有輸入id的時候,自增長會幫我們自動的向最大值進行+1操作。

??

7. 唯一鍵

??一張表中有往往有很多字段需要唯一性,數據不能重復,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有多個字段需要唯一性約束的問題。

??唯一鍵的本質和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空字段不做唯一性比較。

??關于唯一鍵和主鍵的區別:

??我們可以簡單理解成,主鍵更多的是標識唯一性的。而唯一鍵更多的是保證在業務上,不要和別的信息出現重復。 就像我們在學校一樣,我們的學號就是我們的主鍵是唯一標識的,而學生的手機號設置為唯一鍵(可能會人沒有手機號的情況)。

??學號字段是主鍵,它保證了每個學生都有一個唯一的學號,并且學號不能為空。手機號是唯一鍵,它確保了在這個表中手機號的唯一性。因為我們不會使用每個人的手機號做區分的標識。主鍵和唯一鍵不沖突,相互補充。

??

創建表,其中的id為主鍵,phone為唯一鍵:

mysql> create table test7(-> id int primary key,-> phone int unique-> );

在這里插入圖片描述
??

查看表結構:

desc test7;

在這里插入圖片描述
??

插入數據并且打印:

mysql> insert into test7 values(1,111);
mysql> insert into test7 values(2,222);
mysql> insert into test7 values(3,333);mysql> insert into test7 values(4,333);
ERROR 1062 (23000): Duplicate entry '333' for key 'phone' // phone重復,直接報錯mysql> select *from test7;

在這里插入圖片描述

??

8. 外鍵

??外鍵用于定義主表和從表之間的關系:外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當定義外鍵后,要求外鍵列數據必須在主表的主鍵列存在或為null。

在這里插入圖片描述
??

創建主鍵表包含id和name:

create table myclass (id int primary key,name varchar(30) not null comment'班級名'
);

??

創建從表包含id,name,class_id,外連接myclass的id:

create table stu (id int primary key,name varchar(30) not null comment '學生名',class_id int,foreign key (class_id) references myclass(id)
);

在這里插入圖片描述
??

查看兩張表的結構:

在這里插入圖片描述

??

插入數據并且打印:

mysql> insert into myclass values(10, 'C++大牛班'),(20, 'java大神班');
mysql>  insert into stu values(100, '張三', 10),(101, '李四',20);mysql> insert into stu values(102, 'wangwu',30); // 沒有這個班級,插入失敗
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`constraint_test`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `myclass` (`id`))
mysql> select* from myclass;
mysql> select* from stu;

在這里插入圖片描述
??

笛卡爾積打印兩張表的組合:

mysql> select* from stu,myclass;

在這里插入圖片描述
??

篩選出有關聯的數據:

mysql> select* from stu,myclass where stu.class_id=myclass.id;

在這里插入圖片描述

??

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

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

相關文章

MySQL相關問題

MySQL相關問題 一、MySQL支持哪些存儲引擎?二、MySQL是如何執行一條SQL的?三、MySQL數據庫InnoDB存儲引擎是如何工作的?四、如果要對數據庫進行優化,該怎么優化?五、MySQL如何定位慢查詢?六、如何分析MySQL…

揭秘App訪問量背后的秘密:數據統計與分析

在移動互聯網時代,App已成為人們日常生活的重要組成部分。對于App運營者來說,了解用戶的訪問量、行為習慣等數據至關重要。本文將深入探討如何精準統計App訪問量,為運營者提供有價值的數據支持。 一、App訪問量統計的重要性 訪問量是衡量A…

計算機專業必看的十部電影

計算機專業必看的十部電影 1. 人工智能2. 黑客帝國3. 盜夢空間4. 社交網絡5. Her6. 模仿游戲7. 斯諾登8. 頭號玩家9. 暗網10. 網絡迷蹤 計算機專業必看的十部電影,就像一場精彩盛宴! 《黑客帝國》讓你穿越虛擬世界,感受高科技的魅力《模仿游戲…

公網IP怎么獲取?

公網IP是網絡中設備的唯一標識符,用于在Internet上進行通信和定位。對于普通用戶來說,了解如何獲取自己的公網IP是很有必要的,本文將介紹幾種獲取公網IP的方法。 方法一:通過路由器查詢 大多數家庭和辦公室使用的路由器都會有一個…

深入解析Mybatis-Plus框架:簡化Java持久層開發(七)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 簡介 本章節介紹如何通過Mybatis-Plus刪除數據庫中的數據。 本章節不需要前置準備,繼續使用之前的測試類,數據庫表進行操作。 &#x1f4…

一文詳解mysql 的鎖

MySQL鎖是用于管理數據庫中的并發操作的一種機制,它可以確保數據的一致性和完整性。 按范圍劃分:包括全局鎖、表級鎖、頁級鎖和行級鎖。 按類型劃分:包括間隙鎖、臨鍵鎖和記錄鎖。 按級別劃分:包括共享鎖(S鎖&#xff…

如何在Windows輕量應用服務器上安裝和配置SSH?

如何在Windows輕量應用服務器上安裝和配置SSH? 檢查OpenSSH的可用性:首先,需要以管理員身份打開PowerShell并運行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*來檢查OpenSSH服務是否可用。如果服務未啟動或不可…

day03_Vue_Element

文章目錄 01.Ajax1.1 Ajax 概述1.2 同步異步1.3 原生Ajax 2. Axios2.1 Axios的基本使用2.2 Axios快速入門2.3請求方法的別名2.4 案例 3 前后臺分離開發3.1 前后臺分離開發介紹 04 YAPI4.1 YAPI介紹4.2 接口文檔管理 05 前端工程化5.1 前端工程化介紹5.2 前端工程化入門5.2.1 環…

【Python】變量的引用

🚩 WRITE IN FRONT 🚩 🔎 介紹:"謓澤"正在路上朝著"攻城獅"方向"前進四" 🔎🏅 榮譽:2021|2022年度博客之星物聯網與嵌入式開發TOP5|TOP4、2021|2222年獲評…

2024.3.4 作業

1、流式域套接字 1>tcp服務端實現 #include<myhead.h> int main(int argc, const char *argv[]) {//1、創建套接字int sfd socket(AF_UNIX, SOCK_STREAM, 0);if(sfd -1){perror("socket error");return -1;}//2、判斷套接字文件是否存在&#xff0c;如果…

5G工業智能網關保障煤礦安全生產

隨著物聯網技術發展與煤礦需求的持續激增&#xff0c;礦山礦井的分布范圍廣泛、戶外環境惡劣等管理問題急需解決&#xff0c;而物聯網網關工業級設計能夠無懼惡劣環境干擾&#xff0c;輕松解決戶外網絡部署問題。 工業網關通過采集礦井內的各類傳感器數據對礦井進行遠程監控&a…

MySQL中的大表優化方案

當MySQL單表記錄數過大時&#xff0c;數據庫的CRUD性能會明顯下降&#xff0c;一些常見的優化措施如下&#xff1a; 1&#xff1a;限定數據的范圍 務必禁止不帶任何限制數據范圍條件的查詢語句。比如&#xff1a;我們當用戶在查詢訂單歷史的時候&#xff0c;我們可以控制在一個…

【NR 定位】3GPP NR Positioning 5G定位標準解讀(五)

前言 3GPP 標準網址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位標準解讀&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位標準解讀&#xff08;二&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位…

[GYCTF2020]EasyThinking --不會編程的崽

看標題就知道&#xff0c;這大概率是關于thinkphp的題目。先嘗試錯誤目錄使其報錯查看版本號 thinkphp v6.0.0&#xff0c;在網上搜索一下&#xff0c;這個版本有一個任意文件上傳漏洞。參考以下文章。 https://blog.csdn.net/god_zzZ/article/details/104275241 先注冊一個賬…

VL53L8CX驅動開發(1)----驅動TOF進行區域檢測

VL53L8CX驅動開發----1.驅動TOF進行區域檢測 概述視頻教學樣品申請源碼下載主要特點硬件準備技術規格系統框圖應用示意圖區域映射生成STM32CUBEMX選擇MCU 串口配置IIC配置LPn 設置X-CUBE-TOF1串口重定向代碼配置Tera Term配置演示結果 概述 VL53L8CX是一款8x8多區域ToF測距傳感…

STM32(6)中斷

1.中斷 1.1 中斷的概念 STM32的中斷&#xff1a; 1.2 中斷優先級 用數字的大小表示中斷優先級的高低&#xff0c;數字的范圍&#xff1a;0000--1111&#xff08;二進制&#xff09;&#xff0c;即0-15&#xff0c;共16級優先級。 進一步對這4位二進制數進行劃分&#xff0c;可…

demo型xss初級靶場

一、環境 XSS Game - Ma Spaghet! | PwnFunction 二、開始闖關 第一關 看看代碼 試一下直接寫 明顯進來了為什么不執行看看官方文檔吧 你不執行那我就更改單標簽去使用唄 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二關…

區塊鏈技術深度賦能多元行業應用的全景解析

隨著科技的日新月異&#xff0c;區塊鏈這一顛覆性技術正以前所未有的速度從理論走向實踐&#xff0c;并在眾多行業中扮演著關鍵性的變革角色。其獨特的分布式賬本、去中心化運作、公開透明以及數據不可篡改等核心特性&#xff0c;為金融、物聯網&#xff08;IoT&#xff09;、供…

常見的排序算法-(字解版)

快速排序算法 例如&#xff1a;3 1 2 7 5 6 第一次基數&#xff1a; 3 [] 1 2 7 5 6 3 和 6 5 7 比都比 3 大 &#xff0c; 位置不變 [] 1 2 7 5 63 和 2 比 &#xff0c;大于 2 放在右邊。 2 1 [] 7 5 63 和 1 比 &#xff0c;大于 1 位置不變。 2 1 3 7 5 6 把 3 的左邊和右…

分賬系統哪個好 盤點2024年好用的四款分賬系統

分賬系統在現代商業活動中扮演著至關重要的角色&#xff0c;為企業提供了高效、準確的分賬管理。那么&#xff0c;你知道2024年哪幾款分賬系統最好用呢&#xff1f;跟著小編的腳步去看看吧&#xff01; 一、商淘云 商淘云是廣州商淘信息科技有限公司旗下品牌&#xff0c;它提…