MySQL:列屬性(列約束)

来源:http://www.cnblogs.com/zhqiang/archive/2017/05/23/6890111.html
-Advertisement-
Play Games

1. 是否允許為空(Null/not Null) 規定一個欄位的值是否可以是null。預設是可以為空。 此時,插入值a = 10 , b 為空,發現可以正確插入: 若試圖插入值b = 11,而a 不做處理,發現不能正確插入,提示 a 沒有預設值。 即當對某個欄位未輸入信息時,列屬性趨向於先查找有無默 ...


 1. 是否允許為空(Null/not Null)

    規定一個欄位的值是否可以是null。預設是可以為空。

    

    此時,插入值a = 10 , b 為空,發現可以正確插入:

    

    若試圖插入值b = 11,而a 不做處理,發現不能正確插入,提示 a 沒有預設值。

    即當對某個欄位未輸入信息時,列屬性趨向於先查找有無預設值。

   

   tip: NULL與空字元串不同,Null會占用空間,需要表示某些欄位可以為NULL。

2. 設置預設值(default value)

     當插入數據中,有空欄位時,會嘗試查找該欄位有沒有設置預設值。

    若提前設置了預設值,則會使用預設值。如下圖:

    

   當只插入a = 11時,b 由於不允許為NULL,查找預設值,並設置b = 20.

    結果如下圖:

    

    只插入b = 11,也是同樣的道理。

    tip: 若給某欄位插入的值為NULL,則顯示會是NULL,而不會選擇預設值;

         當且僅當沒有給該欄位插入值,並且有預設值時,才會啟用預設值。

       預設值常用的情況是:該欄位不能為空,會設置預設值。

3. 主鍵|唯一索引

   主鍵(PK : primary key):在創建表時,可以唯一標識某條記錄的欄位或欄位集合。

                                         可以是真實實體的屬性,如身份證號,但常用解決方案是利用一個與實體信息不相關的屬性,作為唯一標識

                                         主鍵不與業務邏輯發生關係,只用來標識記錄。

ID 班級 姓名 年齡
1 1520113 張三 24
2 1520114 李四 26

    對於上表,姓名和年齡可能會出現重覆,不能作為主鍵;

   若沒有ID,而其他個欄位單獨都可能出現重覆,可以考慮組合其中某幾個欄位(如班級+姓名),實現唯一標識。

   主鍵的設置方法:

  方案一:欄位上設置

     

     此時,若試圖再次插入一個t_id為1的數據時,會提示錯誤,主鍵不能重覆。

     另外,主鍵t_id也不可以設置為NULL,雖然並未設置NOT NULL。

     但是若類型允許,可以為負值,只要滿足唯一標識原則。

     查詢表,會發現t_id已被設為主鍵。

     

   方案二:在建表的最後聲明

1 create table teacher1(
2 t_id int,
3 t_name varchar(5),
4 class_name varchar(6),
5 days tinyint unsigned,
6 primary key (t_id)    //在定義的末章節附註明主鍵是上述的哪個欄位
7 );

   方案二的優勢:可以標註多個欄位作為組合主鍵

   tip: 註意說法上的嚴謹:現在是一個主鍵上包含了兩個欄位,而不能說這兩個欄位都是主鍵,可以說這兩個欄位組成了主鍵。

   

tip: 自動增長機制(為每條記錄提供一個唯一的標識)

      每次插入記錄時,將某個欄位的值自動加一。

      使用auto_increment標識,如下圖所示

   

   對於設置了auto_increment的主鍵而言,當輸入數據時,若把該欄位的值設為NULL,或者不輸入該欄位內容。

   系統都會以自動增加的形式,為數據編號,如下圖:

   

   

tip: 其實不是主鍵的欄位,也可以設置為auto_increment。

另外,自動增長的初始值是可以設置的,預設是1.

通過alter 語句進行更改,如下圖:

  

此時再插入數據,不設置主鍵的值,會發現結果如下:

tip:當設置的N的值,小於當前主鍵的值時,則可以設置成功,但是實際仍然會基於現有的主鍵值進行自動增長。

question: 設置了auto_increment後,是否還可以手動插入主鍵的值?YES!!只要不發生衝突。

   

能否更新當前的數據?YES,利用update語句。

   

4. 外鍵約束(foreign key)

    若一個實體的某個欄位指向另一個實體的主鍵,eg. student表的欄位class_id指向class表的主鍵class_id。

    就成當前student實體的class_id是外鍵。

    被指向的實體,稱為主實體,也叫父實體。class

    負責指向的實體,稱為從實體,也叫子實體。student

作用:用於約束處於關係內的實體

        ① 增加子表記錄時,是否有與之對應的父表記錄;

        ② 刪除or更新父表記錄時,子表應該如何處理相關的記錄;

定義:在子表上增加外鍵欄位,指向父表的主鍵。

       建立it_class表,設置欄位class_id為主鍵:

   

      建立itcast_student表,定義欄位class_id,並設置它為外鍵,指向it_class表中的主鍵欄位class_id。

      語句為 foreign key (欄位名) references 父表名 (父表主鍵);

   

   若要在itcast_student表中,插入數據,但該學生所指的班級不存在,會導致創建不成功:

   

   可以在父表it_class中插入數據,即使子表中沒有指向其主鍵的數據:

   

級聯操作:當主表數據改變時,與之關聯的從表數據應該如何處理。

① 主表更新:on update

② 主表刪除:on delete

允許的級聯動作:

① cascade:如果主表被更新or刪除,則從表也會執行相應的操作。

② set null:若主表記錄被刪除,則從表相應記錄設置為null。表示從表不指向任何主表記錄。

③ restrict:拒絕主表的相關操作。

 

修改外鍵:

   先刪除,再新建,通過修改表來完成。

   alter table tb_name drop foreign key (class_id);

   刪除外鍵需要通過指定外鍵名稱來達到目的,可以通過在創建外鍵時,指定名稱,也可以使用MySQL預設生成的名稱。

  

   新建外鍵,指定允許的級聯動作為set null:

   

   此時若刪除父表it_class中編號為1的記錄時,會發現與之關聯的從表itcast_student中相應的記錄處,變成了NULL:

   

on update 指的是只有主表的主鍵發生變化,才會對從表發生影響。

 


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

-Advertisement-
Play Games
更多相關文章
  • Precondition : 配有 power path 功能的 BQ2589 手機。 接上 pc usb port。 Origin : 今天有同事問我, 手機是否可以在接上 pc usb port 時,讓手機停充, 有以下幾種停充, 停充_1 : BQ25896 有 power path 的功能, ...
  • 1、參考資料 Mob網站:http://www.mob.com/ Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android 教程:http://www.cnblogs.com/lizhanqi/p/5720962.html 教程的源代碼 ...
  • 功能變數名稱請求錯誤問題 當我們在編寫小程式,要發送請求時,wx.request({})時或許會遇到如下的問題: 一:這是因為微信小程式的開發中,功能變數名稱只能是https方式請求,所以我們必須在小程式微信公眾平臺設置小程式開發設置,配置伺服器合法功能變數名稱(必須是https) 如下圖所示: 二:如果你的所有配置都是準 ...
  • 參考: http://blog.csdn.net/allen_xu5320/article/details/47280457 查出IP 直接ADB連上去 ...
  • 1. order by (排序) 通常使用一個欄位作為參考標準,進行排序。 語法:order by 【欄位】 asc|desc;(升序、降序) tip : 校對規則 決定 排序關係。 允許多欄位排序(先按第一個欄位排序,當出現不能區分的時候,按第二個欄位進行排序,依此類推)。 【舉個慄子】 對於下表 ...
  • 正常途徑訪問Mongodb的官方網站,它只提供了msi 安裝包的下載,這種方式帶來的好處是直接作為windows的服務進行管理。 但是在有些情況下,我們希望不作為windows的服務進行安裝,比如受到公司IT 安全策略的限制,管理員許可權不會提供給我們,那麼在這種情況下,我們希望能夠通過免安裝的方式使 ...
  • 存儲引擎:也叫表類型,相當於 table 的存儲機制、索引方案等配套相關功能。 不同的存儲引擎,由於處理方式不同,帶來的功能or優化不一樣。 要根據實際需求,選擇合理的引擎。 · 存儲類型: Myisam , InnoDB , BDB , Memory , Archive 。 · 預設的 table ...
  • 運維redis很久了,一直是口頭給rd說各種要求,嘗試把這些規範總結成文檔 摘選一些可能比較通用的規則如下: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...