(大資料工程師學習路徑)第四步 SQL基礎課程----約束

來源:互聯網
上載者:User

標籤:

一、簡介

約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性、唯一性。本節實驗就在操作中熟悉MySQL中的幾種約束。

二、內容1、約束分類

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

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

約束類型: 主鍵 預設值 唯一 外鍵 非空
關鍵字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL
2、建立含約束的表

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

當然不用你一行一行地輸入命令搭建這個資料庫,實驗樓已經為你準備好了。首先輸入命令進入Desktop:

cd Desktop
git clone http://git.shiyanlou.com/shiyanlou/SQL3

下載完成後,輸入“cd ~”(注意有空格)退回到原先目錄,然後輸入命令開啟MySQL服務並使用root使用者登入:

sudo service mysql start        #開啟MySQL服務mysql -u root                   #使用root使用者登入

剛才從github下載的SQL3目錄下,有個檔案“MySQL-03-01.sql”,其中包含的代碼可以建立一個資料庫“mysql_shiyan”,然後在其中建立三張表“department”,“employee”,“project”,它們包含了各種約束。

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

運行這個檔案,輸入命令:

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

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

3、主鍵

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

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

也可以這樣定義主鍵:

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

4、預設值約束

預設值約束(DEFAULT)規定,當有DEFAULT約束的列,插入資料為空白時,該怎麼辦。

在MySQL-03-01.sql中,這段程式碼封裝含了DEFAULT約束:

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

INSERT INTO department(dpt_name,people_num) VALUES(‘dpt1‘,11);INSERT INTO department(dpt_name) VALUES(‘dpt2‘);  #people_num為空白

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

5、唯一約束

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

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

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

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

結果

6、外鍵約束

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

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

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

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

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

7、非空約束

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

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

INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(03,‘Jim‘,3400,119119,‘dpt2‘);  #INSERT成功 age為空白,因為沒有非空約束,表中顯示NULLINSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,‘Bob‘,23,123456,‘dpt1‘); #警告 salary被非空約束,值為空白,表中顯示0

結果,出現警告,但還是插入資料成功:

此時employee表的內容為:

(大資料工程師學習路徑)第四步 SQL基礎課程----約束

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.