完整性約束

来源:https://www.cnblogs.com/xuecaichang/archive/2018/09/13/9641084.html
-Advertisement-
Play Games

約束: 為什麼要使用約束? 為了保障數據的合法性,完整性 分類: not null:非空約束,數據不能為空 例如:學生表的姓名欄位 create table student(id int,name char(10) not null,sex char(1) default "woman") uniq ...


約束:

為什麼要使用約束?

為了保障數據的合法性,完整性

分類:

not null:非空約束,數據不能為空

例如:學生表的姓名欄位

create table student(id int,name char(10) not null,sex char(1) default "woman")

unique: 唯一的約束,該欄位的值不能重覆,例如:身份證,手機號,學號

unique其實是一種索引,索引是一種數據結構,用於提高查詢效率,它可以為空,一張表中可以有多個唯一約束

單例唯一約束

create table t5(idcard char(18) unique);

多列聯合唯一約束

create table t6(idcard char(18),phonenumber char (11),unique(idcard,phonenumber));

意思: 身份證相同並且手機號相同,那就叫相同

primary key稱之為主鍵約束,用於唯一標識表中一條記錄

  如何能做到唯一標識,該欄位只要是唯一的並且不為空即可 ,也就是從約束的角度來看主鍵約束和非空加唯一約束沒有區別。

那他們之間的區別是什麼?

  唯一約束是一種索引,必然存在硬碟上的某個文件中,是物理層面,primary key是一種邏輯意義上的數據,實際上不存在。

語法:

create table stu(stuid int primary key,name char(3));

create table t7(id int unique not null,name char(3));

有主鍵和沒有主鍵的區別?

  1.無法區分兩個相同記錄,比如班級里的兩個人名字相同

  2.有主鍵意味著有索引,效率更高

  3.可以建立關聯聯繫

要不要主鍵

必需的,每個表都應該有主鍵,哪怕不用唯一標識,也應該考慮提升效率,主鍵的欄位名幾乎都叫id

同一個表中可不可以有多個主鍵?

不可以,沒有任何意義

主鍵的類型需要設置為整型

 練習
            創建一個員工表 裡面存儲 員工信息 員工編號 姓名 年齡 性別
            create table employee (id int primary key,name char(10) not null,age int not null,sex char(10) default "man");
            插入數據
            INSERT INTO employee VALUES(1,"楊總",20),(2,"egon",49),(3,"wxx",28);
            問題?  你很可能忘記上一次的id到第幾了 導致你要先查看一下
                   麻煩影響效率  所以有了auto_increment


            auto_increment ******
                  中文  自動增長
                  作用   通常搭配主鍵欄位使用  可以自動為你的數據分配逐漸
                    如何分配的?
                    添加一條就自動加1  計數從1開始

             語法: ******
                create table t9(id int primary key auto_increment,name char(3));

                如果主鍵是自動增長  你可以跳過這個欄位 也可以為它插入null  都可以

                修改自動增長的起始位置  **
                alter table t9 auto_increment = 7;

             註意: 自動增長 只能用於整型

 

foreign key:專門用於為表和表之間建立物理關聯

思考:

 

兩個表之間能產生的關係頭哪些?
  1.多對多;2.多對一;3.一對一;4.一對多

在查表之間的關係時,要站在不同的角度去思考。例如對一個公司而言:

  1. 從員工出發,員工對部門來說,多個員工對應一個部門

  2.從部門出發,一個部門對應多個員工

  如果兩個得到的關係不同,則認為這種多對一的關係時單向的
練習:設計學員表和班級表(外鍵加到從表上)

  create table  class (id int primary key auto_increment,name char(10),manager char(10));

  create table  student (id int primary key auto_increment,name char(10),manager char(10),c_id int,foreign key(c_id)references class(id));

 

總結:外鍵的作用,表與表之間建立聯繫

添加 外鍵約束時:產生的限制

    被關聯的表需要先被創建,部門數據(主表)應該先插入,員工數據(從表)後插入,在刪除部門數據前,要保證該部門的員工數據都刪除了,在更新部門編號前,要先保證沒有員工關聯到這個部門

簡單來說,外鍵指的就是另一張的主鍵

外鍵加上以後,主表中的數據刪除和更新時都受到限制

解決方案是為外鍵添加級聯操作

 

級聯操作:指的就是同步更新和刪除

 

語法:在創建外鍵時,在後面添加 on update cascade 同步更新;on delete cascade 同步刪除

實例:

create table class(id int  primary key auto_increment,name char(10));

create table student(

id int primary key auto_increment,

name char(10),

c_id int,

foregin key(c_id) references class(id)

on update cascade

on delete cascade

);

insert into class vallue(null,"python3期");

insert into student value(null,"張煜"’,1)

對主表的id進行更新,以及刪除某條主表記錄,來驗證效果

多對多關係的處理:

  建立一個第三方表,專門存儲兩個表之間的關係,這個關係表應該有兩個欄位,分別關聯學生的id和老師的id,為了保證數據刷的合法性,完整性給這兩個欄位都添加外鍵約束

實例:

create table teacher(id int primary key auto_increment,name char(10));

create table student(id int primary key auto_increment,name char(10));

create table t_s(t_id int,

s_id int,

foregin key(t_id) referenses teacher(id),

foregin key(t_id) referenses student(id),

primary key(t_id,s)id));



insert into student value(null,"lxx");
insert into teacher value(null,"exx");
insert into t_s value(1,1);
實例

 


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

-Advertisement-
Play Games
更多相關文章
  • import matplotlib.pyplot as pltx = [4, 9, 21, 55, 30, 18]labels = ['math', 'history', 'chemistry', 'physics', 'biology','Enrlish']explode = [0, 0.01, ...
  • 背景 隨著數據的積累,MongoDB中的數據量越來越大,數據分析團隊從資料庫中抽取變化數據(假如依據欄位createdatetime,transdatetime),越來越困難。我們知道MongoDB的副本集有一個數據結構Oplog,裡面存儲了Primary節點的所有寫操作(此處的寫操作是指查詢以外的 ...
  • 1.下載RPM包 選擇【Red Hat & Oracle Enterprise Linux】平臺,下載客戶端和伺服器端的RPM包 2.解壓 3.切換root用戶 4.安裝server 5.5 5.更改密碼 6.查看舊版本MySQL的命令 7.卸載舊版本 8.啟動服務 9.安裝客戶端 10.安裝成功後 ...
  • 一.概述 慢查詢日誌記錄了所有的超過sql語句( 超時參數long_query_time單位 秒),獲得表鎖定的時間不算作執行時間。慢日誌預設寫入到參數datadir(數據目錄)指定的路徑下。預設文件名是[hostname]_slow.log,預設超時是10秒,預設不開啟慢查詢日誌。下麵查看慢日誌的 ...
  • 1、檢查是否正確的啟動了resourcemanager服務 若是沒有啟動,請檢查yarn-site-xml配置 2、若是啟動了 1、檢查客戶機和虛擬機之間是否能夠相互ping通 2、檢查虛擬機防火牆是否關閉 3、排查 1、首先,各個虛擬機和客戶端之前都能ping通,虛擬機都能上外網,說明網路沒有問題 ...
  • 前言:要學習spark程式開發,建議先學習spark-shell互動式學習,加深對spark程式開發的理解。spark-shell提供了一種學習API的簡單方式,以及一個能夠進行互動式分析數據的強大工具,可以使用scala編寫(scala運行與Java虛擬機可以使用現有的Java庫)或使用Pytho ...
  • get diagnostics cnt := row_count; 現在有兩個表tab1和tab2,兩個表的格式相同,tab1中有1000條數據,tab2中0條數據 創建測試功能函數 create or replace function test_fun() return integer as $b ...
  • 系統學習一下,記錄一下筆記,之前都是斷斷續續嘗試過一些簡單的安裝使用 下載,解壓 編譯安裝 copy配置文件 啟動連接 ./bin/redis-server ./redis.conf ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...