SQL 的約束

来源:http://www.cnblogs.com/shiyanlou/archive/2017/12/12/8028914.html
-Advertisement-
Play Games

約束是一種限制,它通過對錶的行或列的數據做出限制,來確保表的數據的完整性、唯一性。文章將在實踐操作中熟悉 MySQL 中的幾種約束。 ...


說明:文章所有內容均截選自用戶“實驗樓包工頭”發佈在實驗樓上的教程【MySQL 基礎課程】,想要詳細的學習SQL,點擊教程即可免費學習了;未經允許,禁止轉載;

約束是一種限制,它通過對錶的行或列的數據做出限制,來確保表的數據的完整性、唯一性。文章將在實踐操作中熟悉 MySQL 中的幾種約束。

1 約束分類

聽名字就知道,約束是一種限制,它通過對錶的行或列的數據做出限制,來確保表的數據的完整性、唯一性。

在MySQL中,通常有這幾種約束:

約束類型: 主鍵 預設值 唯一 外鍵 非空
關鍵字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL

2 建立含約束的表

為了方便介紹這幾種約束,我們先建立一個資料庫。

當然不用你一行一行地輸入命令搭建這個資料庫,實驗樓已經為你準備好了。首先打開 Xfce 終端,輸入命令進入 /home/shiyanlou/Desktop 目錄:

cd Desktop

使用 git 命令將需要的數據文件下載到本地文件夾:

git clone https://github.com/shiyanlou/SQL3

下載完成後,輸入命令開啟 MySQL 服務並使用 root 用戶登錄:

#打開 MySQL 服務
sudo service mysql start        

#使用 root 用戶登錄
mysql -u root                   

剛纔下載的 SQL3 目錄下,有個文件 MySQL-03-01.sql,其中包含的代碼可以新建一個資料庫 mysql_shiyan,然後在其中創建三張表 departmentemployeeproject,它們包含了各種約束。

(SQL3 目錄在桌面上,你可以用Gedit查看裡面的 MySQL-03-01.sql 文件。)

載入文件中的數據,需要在 MySQL 控制臺中輸入命令:

source /home/shiyanlou/Desktop/SQL3/MySQL-03-01.sql;

查看一下這個資料庫,輸入命令 show tables;,可見:

00

3 主鍵

主鍵 (PRIMARY KEY)是用於約束表中的一行,作為這一行的唯一標識符,在一張表中通過主鍵就能準確定位到一行,因此主鍵十分重要。主鍵不能有重覆且不能為空。

MySQL-03-01.sql 中,這裡有主鍵:

07

也可以這樣定義主鍵:

08-

還有一種特殊的主鍵——複合主鍵。主鍵不僅可以是表中的一列,也可以由表中的兩列或多列來共同標識,比如:

09-

4 預設值約束

預設值約束 (DEFAULT) 規定,當有 DEFAULT 約束的列,插入數據為空時,將使用預設值。

MySQL-03-01.sql 中,這段代碼包含了 DEFAULT 約束:

10

DEFAULT 約束只會在使用 INSERT 語句(上一實驗介紹過)時體現出來,INSERT語句中,如果被 DEFAULT 約束的位置沒有值,那麼這個位置將會被 DEFAULT 的值填充,如語句:

# 正常插入數據
INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);

#插入新的數據,people_num 為空,使用預設值
INSERT INTO department(dpt_name) VALUES('dpt2');  

輸入命令 SELECT * FROM department;,可見表中第二行的people_num 被 DEFAULT 的值 (10) 填充:

01

5 唯一約束

唯一約束 (UNIQUE) 比較簡單,它規定一張表中指定的一列的值必須不能有重覆值,即這一列每個值都是唯一的。

MySQL-03-01.sql 中,也有 UNIQUE 約束:

11

當 INSERT 語句新插入的數據和已有數據重覆的時候,如果有 UNIQUE約束,則 INSERT 失敗,比如:

INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1');
INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2'); 

結果如圖:

02

6 外鍵約束

外鍵 (FOREIGN KEY) 既能確保數據完整性,也能表現表之間的關係。

一個表可以有多個外鍵,每個外鍵必須 REFERENCES (參考) 另一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。

12-

在 INSERT 時,如果被外鍵約束的值沒有在參考列中有對應,比如以下命令,參考列 (department 表的 dpt_name) 中沒有dpt3,則INSERT 失敗:

INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dpt3');

可見之後將 dpt3 改為 dpt2(department 表中有 dpt2),則插入成功:

03

7 非空約束

非空約束 (NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。

13

在MySQL中違反非空約束,不會報錯,只會有警告,比如以下語句:

#INSERT 成功 age 為空,因為沒有非空約束,表中顯示 NULL
INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(03,'Jim',3400,119119,'dpt2'); 

#警告 salary 被非空約束,值為空,表中顯示0
INSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,'Bob',23,123456,'dpt1'); 

結果如圖,出現警告,但還是插入數據成功,實驗樓的環境是 5.5.505.6 版本以上的 MySQL 會報錯,禁止插入不符合非空約束的數據:

04

此時 employee 表的內容為:

05

總結

文章通過一個資料庫實例瞭解了主鍵、預設值、外鍵、非空、唯一這幾種約束的特性,這幾種約束都是最常見的,需要仔細理解每種約束的含義及使用場景。

教程【MySQL 基礎課程】共17個實驗+3個挑戰,課程列表如下:

image.png
image.png
image.png


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、安裝ftp服務 1、打開伺服器管理器,如圖: 2、右鍵點擊角色,如圖: 3、點擊添加角色,會出現添加角色嚮導對話框,如圖: 4、點擊下一步,選擇要添加的“web伺服器(IIS)” ‘’ 5、點擊下一步,如圖: 6、點擊下一步,勾選FTP伺服器,如圖: 7、點擊下一步,出現確認安裝選擇對話框,如圖 ...
  • ...
  • (1101001.101)2=(105.625)10=(151.5)8=(69.A)16(357.25)10=(101100101.01)2=(545.2)8=(165.4)16(9C4D.52A)16=(101110001001101.01010010101)2=(116115.2452)8(47 ...
  • 企業級nosql資料庫應用與實戰-redis 環境背景:隨著互聯網2.0時代的發展,越來越多的公司更加註重用戶體驗和互動,這些公司的平臺上會出現越來越多方便用戶操作和選擇的新功能,如優惠券發放、搶紅包、購物車、熱點新聞、購物排行榜等,這些業務的特點是數據更新頻繁、數據結構簡單、功能模塊相對獨立、以及 ...
  • ...
  • 當危險的動作發生, 誤刪 /user/bin目錄後的補救 以下是昨天晚上真實的誤操作現場,模擬記錄一下 (這是測試環境,所以操作得很隨意,有些執行動作很不規範) ...
  • 本文同時發表在 "https://github.com/zhangyachen/zhangyachen.github.io/issues/117" 首先說明一下MySQL的版本: 表結構: id為自增主鍵,val為非唯一索引。 灌入大量數據,共500萬: 我們知道,當limit offset row ...
  • 本篇文章就是給大家科普一下,解壓版的MySQL資料庫下載與安裝的具體步驟 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...