MySQL 表約束

来源:https://www.cnblogs.com/monkey-code/archive/2020/06/18/13158717.html
-Advertisement-
Play Games

約束概述 對數據表中數據的限制條件叫表的約束,目的是為了保證表中記錄的完整和有效。例如非空、唯一等。 查看約束 1 通過查看建表語句 查看表中的約束 show create table tb_name; 2 通過檢查約束表 查看約束 select * from information_schema. ...


約束概述

對數據表中數據的限制條件叫表的約束,目的是為了保證表中記錄的完整和有效。例如非空、唯一等。

查看約束

1 通過查看建表語句 查看表中的約束

show create table tb_name;

2 通過檢查約束表 查看約束

select * from information_schema.table_constraints where table_name='usr';

Tips:在MySQL資料庫中 所有的約束都存放在information_schema.table_constraints表中~~~~參看~~~~~information_schema資料庫介紹

主鍵約束

什麼是主鍵約束

在MySQL中主鍵是一種約束,也是一種索引。被設為主鍵的欄位 要求 不重覆 不能為空 不能預設。主鍵的作用為唯一的確定表中的一條記錄。需要註意的是 當主鍵是複合主鍵時,不重覆的含義是 組合起來不重覆即可,單列值允許重覆,但不允許同時重覆

創建主鍵

1 在欄位中定義主鍵

create table if not exists user(
    id int(11) auto_increment primary key,
  	name char(64) not null default 'No Name'
);

2 欄位定義結束後定義主鍵

create table if not exists user(
		id int(11) auto_increment,
  	name char(64) not null default 'No Name',
  	primary key(id,name)
);
-- 註意 聲明主鍵的完整格式應該是這樣的
-- constraint 約束名 primary key key_name

3 建表完成後添加主鍵

上邊的兩種方式都是在創建表時候指定主鍵約束,也可以在表建成後添加主鍵約束

alter table tb_name add primary key(key_name)
-- tb_name   表名
-- primary key() 括弧里填寫欄位名,可以是一個 也可以是多個(複合主鍵)

刪除主鍵

-- 如果主鍵欄位中包含有自增 auto_increment,需要先刪除自增屬性 在刪除主鍵
-- 如果沒有自增直接刪除主鍵即可

-- 刪除自增類型。 !!!註意 自增是類型 所以 可以使用 修改欄位的類型就ok

--1 修改欄位的名 修改後需要重新指定類型
alter table tb_name change col_name col_name int;

--2 簡單的直接修改類型
alter table tb_name modify col_name int;

-- 刪除掉 auto_increment屬性後可以刪除主鍵
alter table tb_name drop primary key;

主鍵的分類

1 單一主鍵

創建 1 中 創建的 id 就是單一的主鍵,需要註意,定義欄位時聲明主鍵是無法創建複合主鍵的。

2 複合主鍵

創建 2 中的創建主鍵的方式 允許創建單一主鍵也允許創建複合主鍵,推薦使用這種方法進行主鍵的創建。

3 聯合主鍵

當處理多對多的關係時,需要創建中間表來進行多對多的關聯,此時中間表的主鍵成為聯合主鍵,他能唯一的確定多對多的若幹實體間的對應關係。聯合主鍵也可以是複合主鍵即聯合主鍵由第三表的多個列複合而成。保持唯一。

外鍵約束

什麼是外鍵

外鍵依托於具有唯一約束的欄位,一般來講主鍵會多一些,但是也可以不是主鍵。前提是它們具有唯一約束。外鍵依賴的欄位可以來自本(自參照表)也可以是其他表,一般的是其他表的情況多一些。此時要求 主表必須已經存在於資料庫中,或者是當前正在創建的表。如果被依賴欄位在本表中,那麼這樣的約束結構稱為 自參照完整性。

Tips: 雖然主鍵不允許為空不允許重覆,但是外鍵可以為空,也可以重覆。外鍵約束要求每一個值都來自於主鍵,特別的插入空值時,MySQL不支持預設,必須顯式表達出來,例如

insert into user(name,leader_id) values('monkey',null);  
-- 顯示的寫出 null 否則 會報錯
insert into user(name,leader_id) values('monkey');  
-- 是不合法的語句
  • 在父表的表名後面指定列名或列名的組合。這個列或列的組合必須是父表的主鍵或候選鍵。
  • 外鍵中列的數目必須和父表的主鍵中列的數目相同。
  • 外鍵中列的數據類型必須和父表主鍵中對應列的數據類型相同。

創建外鍵

1 建表時創建外鍵
[constraint <fk_name>] foreign key(fk_col_name [,col_name2,…])
references <tb_name> (pk_col_name1 [,pk_col_name2,…])
-- fk_name				外鍵名
-- fk_col_name		設置外鍵欄位的欄位名
-- tb_name				外鍵關聯的主表表名
-- pk_col_name 		主表被依賴的欄位名

2 建表完成後創建
alter table tb_name add [constriant <fk_name>] foreign key(fk_name) references tb_name(pk_col_name)
-- fk_name				外鍵名
-- fk_col_name		設置外鍵欄位的欄位名
-- tb_name				外鍵關聯的主表表名
-- pk_col_name 		主表被依賴的欄位名

例子

-- 創建主表 leader
create table leader(
  	id int(11) primary key auto_increment, 
  	name char(64) not null
);

-- 創建外鍵所在表 employee
create table employee(
  	id int(11) primary key auto_increment, 
  	name char(64) not null,
  	leader_id int(11),
  	constraint fk_leader_employee foreign key(leader_id) references leader(id)
);
create table employee(
  	id int(11) primary key auto_increment, 
  	tid char(11),
  	name char(64) not null,
  	leader_id int(11),
  	constraint fk_leader_employee foreign key(name) references leader(name)
);
註意
  • 外鍵 和 關聯的主表欄位類型必須一致,但是允許size不一致,但是這樣可能會出現無法預期的問題,不推薦這樣做,曾經在使用django的ORM時,手寫了migrations文件,導致出現類似情況,很大的坑。
  • 外鍵欄位可以是主表的多個欄位(複合主鍵或者其他的情況都是被允許的,但是此時要保證關聯欄位和被關聯欄位要能對應起來)
  • 特別要說明的是,作為其他表外鍵的主表欄位必須是具有唯一約束(主鍵欄位原生就自帶 unique 屬性,如果不是主鍵,那必須要手動的設置unique 當是外鍵是多個欄位時,需要設置複合唯一

刪除外鍵

同刪除主鍵類似,不同的是,每張表只有一個主鍵,因此不需要指定主鍵名,但是外鍵 外鍵名是不虛指定的。

alter table tb_name drop foreign key fk_name;
-- fk_name  			外鍵約束名 也就是 constrain 後面的名字

唯一約束

什麼是唯一約束

唯一約束就是要求欄位中的值是唯一,特別的它允許為空,但只能出現一個空值。唯一約束可以確保一列不出現重覆值,或者若幹列不出現重覆的組合。

創建唯一約束

1 欄位定義時添加

create table leader(
  	id int(11) primary key auto_increment,
  	name char(64) unique,
);
-- name 欄位唯一 ,不允許有重名的出現

2 欄位定義完成後添加

create table leader(
  	id int(11) primary key auto_increment, 
  	name char(64),
  	constraint uq_name unique key(name)    -- 在這裡寫唯一約束 與主鍵類似
);

註意

  • 唯一約束和主鍵約束的區別在於主鍵中不許出現null 但是唯一 要求只能出現一個空值
  • 一張表中可以有若個個唯一約束,但是只能存在一個主鍵約束

3 建表完成後添加

alter table tb_name add [constaint uq_name] unique key(uq_col_name)
-- tb_name 				要修改的表名
-- uq_name 				約束名<索引名>
-- uq_col_name 		聲明唯一的欄位名
-- 約束名 可以不寫

刪除唯一約束

alter table tb_name drop index fk_name;
-- tb_name 			表名
-- fk_name    	約束名<索引名>

預設值約束和非空約束

default 應該被稱為預設值約束,他也是一種約束,作用和簡單,指定某欄位的預設值

創建預設值約束

1 欄位中定義預設值/非空

create table user(
		id int(11) auto_increment primary key,
  	age int(4) default 18,
  	name char(64) not null
);

2 表建成後添加

alter table tb_name change col_name col_type[size] default <預設值>
-- 就是簡單的修改表的結構語句
alter table user change col_name col_type[size] {default 預設值 | not null | null }

刪除預設值/非空約束

-- 修改表結構 將預設值 設置為null
alter table tb_name change col_name col_type[size] default null;
-- 或者
-- 修改表結構 修改欄位的類型
alter table tb_name modify col_name col_type[size];

檢查約束

MySQL不支持檢查約束,官方文檔上說,即使設置了檢查約束,但是mysql不會強制的要求這樣做。創建之後在information_schema.table_constraints 找不到相關的記錄。甚至他可能本身就不存在。

什麼是檢查約束

檢查約束一般來說是為了滿足用戶實際的實體完整性而存在的。例如 身高應該 high > 10 and high < 280

創建檢查約束

1 創建表時添加

check <約束條件>
-- 例子
create table userinfo(
		id int(11) auto_increment primary key,
  	high int(4) default 160,
  	weight int(4) default 50,
  	check(heigh > 10 and heigh < 280)
);

2 創建完成後添加

alter table userinfo add constraint check_name check(約束條件)
-- 例如
alter table userinfo add constraint check_weight check(weight > 10 and weight < 300);

刪除檢查約束

alter table tb_name drop constraint check_name;
-- 例如
alter table userinfo drop constraint check_weight;
-- 值得註意的是,mysql 雖然說創建成功了,但是在information_schema 資料庫的 table_constraints 表中並不能找到相關的信息。MySQL不支持檢查約束。

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

-Advertisement-
Play Games
更多相關文章
  • linux 解析度設置:找到合適的解析度-cvt 生成解析度參數-添加解析度模式-使用圖形界面選擇; step1:找到合適顯示器的解析度 1366*768 1920*1080 等; step2:打開命令視窗,輸入cvt 1920 1080(假設屏幕合適的解析度為1920*1080) 出現:Model ...
  • CentOS7 源碼部署nginx nginx簡介: nginx是一款高性能的 HTTP 和反向代理 Nginx的優點: 1.高併發量:根據官方給出的數據,能夠支持高達 50,000 個併發連接數的響應 2.記憶體消耗少:處理靜態文件,同樣起web 服務,比apache 占用更少的記憶體及資源,所有它是 ...
  • 在安裝docker時候遇到很多問題,在這裡分享一下, 1.在國內使用docker官方的源真的是慢, https://download.docker.com/linux/centos/#Docker官方源 [root@localhost ~]# cat /etc/yum.repos.d/Docker- ...
  • 通過IP安全策略(以關閉135埠為例) (1) 依次打開“控制面板-->系統和安全-->管理工具-->本地安全策略-->ip安全策略,在本地電腦” (2)在本地組策略編輯器右邊空白處 右鍵單擊滑鼠,選擇“創建IP安全策略”,彈出IP安全策略嚮導對話框,單擊下一步;在出現的對話框中的名稱處寫“名稱 ...
  • Hello 大家好,我是TANZAME,我們又見面了。今天我們來聊聊怎麼手擼一個 Redis Cluster 集群客戶端,純手工有乾貨,您細品。 隨著業務增長,線上環境的QPS暴增,自然而然將當前的單機 Redis 切換到群集模式。燃鵝,我們悲劇地發現,ServiceStack.Redis這個官方推 ...
  • 註意環境變數的設置: 打開終端,輸入: open -e .bash_profile #打開環境變數設置文件 在文件中輸入: export PATH=${PATH}:/usr/local/mysql/bin 保存文件並退出。 安裝完成後,啟動進入的時候會出現這個錯誤: ERROR 1045 (2800 ...
  • MySQL的邏輯架構  連接器:負責用戶的身份認證和許可權校驗。 查詢緩存:這個在8.0以後的版本已經取締了,但是不影響設計思想的瞭解,即:當有一個SQL進來的時候,先會去匹配SQL語句,如果本地已經有緩存,即直接讀緩存,返回結果。乍一聽挺好的功能,為什麼會被取締呢?這存在一些設計理念的問題,MyS ...
  • CURSOR是強類型,SYS_REFCURSOR 是弱類型(類似C#的var)。 Cursor: create or replace package pkg as cursor cur is select 1 n from dual; type tcur is ref cursor return p ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...