MySQL 約束

查看約束

在這里插入圖片描述

select * from information_schema.table_constraints
where   table_name='要查看的表名'

按約束的作用范圍

列級約束: 將此約束聲明在對應字段的后面

表級約束:在表中所有字段都聲明完,在所有字段的后面聲明的約束,可以聲明組合約束

約束的作用

  1. not null 非空約束
  2. unique 唯一約束
  3. primary key 主鍵約束
  4. foreign key 外鍵約束
  5. check 檢查約束
  6. default 默認值約束

在這里插入圖片描述

添加約束

聲明表定義約束

create table 表名 (
id int not null
);

聲明表之后,追加、刪除約束

alter table 表名
modify 列 類型 約束 — 追加約束 寫上約束便可,若刪除約束 不寫約束便可

sql server 追加約束

alter table 表名
add constraint 約束名 約束類型 (字段)

alter table 表名
add constraint ch_tel check( 列名 like [0-9] [0-9][0-9][0-9] )

非空約束

聲明表定義約束

create table 表名 (
id int not null
);
聲明之后追加約束
alter table 表名
modify 列 類型 not null— 追加約束 寫上約束便可,若刪除約束 不寫約束便可

刪除非空約束

alter table 表名
modify 列 類型 — 除去 not null 便可

唯一約束 UNIQUE

在這里插入圖片描述

  1. 同一個表可以有多個唯一約束
  2. 唯一約束可以是某一列的值唯一,也可以多個列組合的值唯一(復合約束)
  3. 唯一約束允許列值為空, 主鍵約束 是特殊的唯一約束,只是不允許為 null,即 主鍵約束(primary key)相當于 唯一約束+非空約束組合,主鍵約束 列 不允許重復,且不能出現 空值 null
  4. 在創建唯一約束的時候,若沒有給唯一約束 命名,則默認和列名相同。復合唯一約束,沒命名,也取 復合列中的第一個列 做為約束名
  5. Mysql 會給唯一約束的列上默認創建一個唯一索引, SQL server 中 主鍵約束,會默認創建一個 唯一索引

在create table 添加唯一約束

create table 表名(
sut_NO char(8) UNIQUE, – 列級約束
sut_ID char(18), – , 別忘記
constraint 約束名 UNIQUE(sut_ID ) 可以簡寫 UNIQUE KEY (sut_ID) —表級約束
);

在create table 添加復合唯一約束

create table 表名(
sut_NO char(8) , – 列級約束
sut_ID char(18), – , 別忘記
constraint 約束名 UNIQUE(sut_ID ,sut_NO) 可以簡寫 UNIQUE KEY (sut_ID,sut_NO) —表級約束
);

建表后 指定唯一約束

方式1 支持復合約束的
alter table 表名 add unique key(字段列表)

方式2 不支持復合約束
alter table 表名 modify 字段名 unique

刪除唯一約束
在這里插入圖片描述

alter table 表名
DROP INDEX 索引名

查看表的索引
show index from 表名 ;

主鍵約束 PRIMARY KEY

主鍵約束: 唯一約束+ 非空約束 非空且唯一
在這里插入圖片描述

create table 主鍵約束

create table student (
id int autoincrement,
name   varchar(10),
stu_ID  char(18)  primary key   -- 列級約束----身份證號  create table student (
id int ,
name   varchar(10),
stu_ID  char(18) ,
--   MYSQL   主鍵名總是PRIMARY ,就算命名了主鍵約束名,也沒用
constraint  約束名 primary key(stu_ID)   -- 列級約束----身份證號  

建表后 指定唯一約束

alter table 表名
add primary key (字段、字段);

刪除主鍵約束

alter table 表名
drop primary key;

自增列 AUTO_INCREMENT

在這里插入圖片描述
自增列的特點

  1. 一個表最多只能有一個自增長列,SQLServer 也是這樣, 同一個表,后面列設置Identity,前面設置的就自動取消了。
  2. 當需要產生唯一標識符或順序值時,可設置自增長
  3. 自增長列約束的列必須是鍵列(主鍵列,唯一鍵列),否則會出現上面的錯誤。
  4. 自增約束的列的數據類型必須是整數類型
  5. 如果自增列指定了0和null,會在當前最大值的基數上自增;如果自增列手動指定具體值,直接賦值為具體的值 .[ insert ]

create table 自增列

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

建表后 指定自增列

alter table 表名
modify 列名 數據類型 auto_increment;

刪除自增列

alter table 表名
modify 列名 數據類型 ;

sql server identity **
在這里插入圖片描述
要想顯示的為某表的標識列顯示添加數據,在insert語句中
一定要在表后面顯示**要添加的字段,即使是所有字段,也不能省略。

如:Table_1(ID,score,name),如果只寫Table_1仍然不能為ID顯示的添加數據。

注意2:插入完數據要將identity_insert設置為OFF。

若不關閉,則再次添加數據時,無法自增長,提示錯誤信息:

set identity_insert 表名 ON
insert into 表名(列,。。。列)
values(值,。。。。值)
set identity_insert 表名 OFF

自增列 mysql 5.7 與 mysql 8.0 系列 區別

MySQL 5.7 自增主鍵 Auto_increment 的值如果大于 表中的 最大值+1,在mysql重啟之后,會重置Auto_increment值 modify 列名 數據類型 現有表中 最大值+1 (就刪除數據,導致內存中表的auto_increment > 表中最大的自增列的值+1,重啟mysql,內存中auto_increment 就會消失,會根據 獲取 現有表中 自增列的 最大值+1,放在內存作為此表的 auto_increment 值 ), 這種現象在某些情況下,會導致業務主鍵沖突或者其他難以發現的問他

MySQL 8.0 系列 將自增主鍵的計數器持久化到 重做日志 中。每次計算器發生改變,都會將其寫入重做日志中。如果數據庫重啟,InnoDB會根據重做日志中的信息來初始化計數器的內存值。

在這里插入圖片描述

create table  表名(
id int auto_increment primary key,
name char(10)
) engine innodb  auto_increment=100  default charset 'utf8'

或者 首條記錄指明 自增列的值,后續就 +1了
insert into 表名
values(300,‘zen’);
insert into 表名 (name)
values(‘zen’); //id jius 301

alter table 表名
modify 字段 類型 Auto_increment;
alter table 表名
modify 字段 類型 primary key Auto_increment;

外鍵約束 Foreign key

**sql server **
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

主表:有外鍵 對應的表,就是主表,或稱 父表
從表:有外鍵的表,就算從表,或稱 子表
城市表(主表), 學生表(從表), 學生表中的戶籍地址外鍵,對應城市表的主鍵。
注意外鍵對應的在主表中,必須是主鍵或者唯一鍵

Mysql
外鍵的 特性:

  1. 從表的外鍵列,必須引用或參考主表的鍵(主鍵或唯一約束的列),因為被依賴或被參數的值必須是唯一的。
  2. 在創建外鍵約束時,如果不給外鍵約束命名**,默認名不是列名,而是自動產生一個外鍵名**,也可以指定外鍵約束名
  3. 創建(create)表時就指定外鍵約束的話,先創建主表,再創建從表 從表依賴主表
  4. 刪表時,先刪從表(或先刪除外鍵約束),再刪除主表( 從表依賴主表。)
  5. 當主表的記錄被從表參照時,主表的記錄將不允許刪除。如果要刪除數據,需要先刪除從表中依賴該記錄的數據,然后才可以刪除主表的數據
  6. 在從表中指定外鍵約束,并且一個表可以建立多個外鍵約束
  7. 從表的外鍵列與主表被參照的列名子可以不相同,但是數據類型必須一樣,邏輯意義要一致。如果類型不一樣,創建子表時,就會出現錯誤。
  8. 當創建外鍵約束時,系統默認會在所在的列上建立對應的普通索引。但是索引名是列名,不是外鍵的約束名(根據外鍵查詢效率很高,因為外鍵,系統會創建普通索引
  9. 刪除外鍵約束后,必須手動刪除對應的索引

create table 創建外鍵
在這里插入圖片描述

主表
create table department(
dept_id char(10) primary key,
dept_name varchar(15));

從表
create table employee(
emp_no char(6) primary key ,
department_id chart(10),
【constraint FK_emp_dept】 foreign key (department_id) references department(dept_id));

alter table 創建外鍵

主表
create table department(
dept_id char(10) primary key,
dept_name varchar(15));

從表
create table employee(
emp_no char(6) primary key ,
department_id chart(10)
);

alter table employee
add 【constraint FK_emp_dept】 foreign key (department_id) references department(dept_id);

刪除外鍵
在這里插入圖片描述
在這里插入圖片描述

1.首先要查看約束
select * from information_schema.table_constraints
where table_name = ‘表名’;

  1. 刪除外鍵約束
    alter table 表名
    drop foreign key 外鍵約束名; – drop primary key 刪除主鍵約束

  2. 查看表的索引
    show index from 表名;

  3. 刪除索引
    alter table 表名
    drop index 索引名;

約束等級

  1. Cascade 方式: 在父表上 updae | delete 數據時,同步 Update | Delete 子表的匹配記錄
  2. Set null 方式: 在父表上update/delete記錄時,將子表上匹配記錄的列設為null要注意子表的外鍵列不能為not null
  3. No action 方式:如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作
  4. Restrict 方式:同no action, 都是立即檢查外鍵約束

主表
create table department(
dept_id char(10) primary key,
dept_name varchar(15));

從表
create table employee(
emp_no char(6) primary key ,
department_id chart(10),
【constraint FK_emp_dept】 foreign key (department_id) references department(dept_id) on update cascade on
);

外鍵創建的規定

在 mySQL 里,外鍵約束是有成本的,需要消耗系統資源。對于大并發的SQL操作,有可能會不適合。比如大型網址中的中央數據庫,可能會因為外鍵約束的系統開銷而變得非常慢。所以,MYSQL 允許你不使用系統自帶的外鍵約束,在 應用層面完成檢查數據一致性的邏輯。也就是說,即使你不用外鍵約束,也要想辦法通過應用層面的附加邏輯,來實現外鍵約束的功能,保持數據的一致性、

【阿里開發規范】
【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決
說明: 學生表中的Student_id 是主鍵,那么成績表中的student_id 則為外鍵。如果更新學生表中的 student_id ,同時觸發成績表中的student_id 更新,即為級聯更新。外鍵與級聯更新適用于 單機低并發,不適合分布式、高并發集群;級聯更新是強阻塞,存在數據庫 【更新風暴】的風險;外鍵影響數據庫的插入速度。

外鍵約束(foreign key)不能跨引擎使用
mySQL 支持多種存儲引擎,每一個表都可以指定一個不同的存儲引擎,需要注意的是:外鍵約束是用來保證數據的參考完整性的,如果表之間需要關聯外鍵,卻指定了不同的存儲引擎,那么這些表之間是不能創建外鍵約束的。所以說,存儲引擎的選擇也不完全的隨意的

check 約束

sql server
在這里插入圖片描述
刪除約束
alter table zen_4
drop constraint CK__zen_4__gender__6DB73E6A

作用 | 功能
檢查某個字段的值是否符合xxx 要求,一般指的是值的 范圍

**mysql 5.7 不支持 check mysql 8.0 支持 **

create table
create table 表名(
id int,
gender char(1) check (gender =’男‘ or gender =’女‘)

alter table
alter table 表名
modify id int check(id <100);

在這里插入圖片描述
在這里插入圖片描述

Default 約束

create table
create table 表名(
id int,
name char(10),
salary decimal(8,2) default 2080 );

alter table
alter table 表名
modify salary decimal(8,2) default 2200;

刪除 Defualt 約束
alter table 表名
modify salary decimal(8,2);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39218.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

屏蔽惡意域名的DNS查詢

因為有一些惡意域名, 已經在防火墻上做了封禁了, 但是如果收到中毒主機的請求, 還是要去做一次DNS查詢, 因此被上級單位通告, 因此想把惡意域名的DNS查詢封禁做到防火墻下聯的AC上面, 一方面因為防火墻的策略優先級DNS代理比較靠后, 另一方面也是為了減小防火墻壓力, 簡化配置:…

【leetcode】鏈表part2

24. 兩兩交換鏈表中的節點 迭代方法 public static ListNode swapPairs(ListNode head) {// 輸入&#xff1a;head [1,2,3,4]// 輸出&#xff1a;[2,1,4,3]ListNode dummy new ListNode(0);dummy.next head;ListNode cur dummy;while (cur.next ! null && cur.ne…

數據結構的樹存儲結構

數據結構的樹存儲結構 之前介紹的所有的數據結構都是線性存儲結構。本章所介紹的樹結構是一種非線性存儲結構&#xff0c;存儲的是具有“一對多”關系的數據元素的集合。 (A) (B) 圖 1 樹的示例 圖 …

【Java】2021 RoboCom 機器人開發者大賽-高職組(復賽)題解

7-8 人工智能打招呼 號稱具有人工智能的機器人&#xff0c;至少應該能分辨出新人和老朋友&#xff0c;所以打招呼的時候應該能有所區別。本題就請你為這個人工智能機器人實現這個功能&#xff1a;當它遇到陌生人的時候&#xff0c;會說&#xff1a;“Hello X, how are you?”其…

chatglm2-6b模型在9n-triton中部署并集成至langchain實踐 | 京東云技術團隊

一.前言 近期&#xff0c; ChatGLM-6B 的第二代版本ChatGLM2-6B已經正式發布&#xff0c;引入了如下新特性&#xff1a; ①. 基座模型升級&#xff0c;性能更強大&#xff0c;在中文C-Eval榜單中&#xff0c;以51.7分位列第6&#xff1b; ②. 支持8K-32k的上下文&#xff1b…

三種目標檢測方法(基于傳統數字圖像處理的識別方法、基于傳統機器學習的識別方法和基于深度學習的識別方法)的區別

問題描述&#xff1a;圖像檢測分為了基于傳統數字圖像處理的識別方法、基于傳統機器學習的識別方法和基于深度學習的識別方法&#xff0c;但是有時迷惑三者的區別是什么呢&#xff1f; 問題解答&#xff1a; 第一&#xff0c;基于傳統數字圖像處理的識別方法和其他兩者的區分…

【Linux】進程地址空間

目錄 一、回顧我們以前學習的地址空間二、進程地址空間三、進程地址空間的作用四、解決一個地址出現兩個值的問題 一、回顧我們以前學習的地址空間 這個內存布局真是的我們實實在在的內存嘛&#xff1f; 答案是不是的 下面我們來驗證 1 #include<stdio.h>2 #include<a…

從三個主要需求市場分析,VR全景創業的潛力發展

VR全景&#xff0c;5G時代朝陽產業&#xff0c;其實拍攝制作很簡單&#xff0c;就是利用一套專業的相機設備去給商家拍攝&#xff0c;結合后期專業的3DVR全景展示拍攝制作平臺&#xff0c;打造3D立體環繞的效果&#xff0c;將線下商家真實環境1&#xff1a;1還原到線上&#xf…

使用docker快速搭建wordpress服務,并指定域名訪問

文章目錄 引入使用docker快速跑起服務創建數據庫安裝wordpress服務配置域名 引入 wordpress是一個基于PHP語言編寫的開源的內容管理系統&#xff08;CMS&#xff09;&#xff0c;它有豐富的插件和主題&#xff0c;可以非常簡單的創建各種類型的網站&#xff0c;包括企業網站、…

Java異步方法CompletableFuture類的使用

Java中常用的異步方法 1、使用線程&#xff1a;你可以創建一個新的線程來執行異步操作。這可以通過直接創建Thread對象并啟動它&#xff0c;或者使用線程池來管理線程的生命周期。 new Thread(() -> {// 異步操作代碼 }).start(); 2、使用線程池Executor框架&#xff1a;E…

Spring Boot 支持多種環境,包括開發環境、測試環境、預發布環境和生產環境。

Spring Boot 支持多種環境&#xff0c;包括開發環境、測試環境、預發布環境和生產環境。不同的環境具有不同的配置&#xff0c;可以在不同的環境中對應用程序進行測試、驗證和部署。以下是每種環境的用途和相應的代碼案例。 開發環境 開發環境是開發人員在本地進行開發的環境&…

AI Chat 設計模式:15. 橋接模式

本文是該系列的第十五篇&#xff0c;采用問答式的方式展開&#xff0c;問題由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字則主要是我的一些思考和補充。 問題列表 Q.1 如果你是第一次接觸橋接模式&#xff0c;那么你會有哪些疑問呢&#xff1f;A.1Q.2 什…

內網隧道—HTTP\DNS\ICMP

本文僅限于安全研究和學習&#xff0c;用戶承擔因使用此工具而導致的所有法律和相關責任&#xff01; 作者不承擔任何法律和相關責任&#xff01; HTTP隧道 Neo-reGeorg Neo-reGeorg 是一個旨在積極重構 reGeorg 的項目&#xff0c;目的是&#xff1a; 提高可用性&#xff0…

山西電力市場日前價格預測【2023-08-17】

日前價格預測 預測明日&#xff08;2023-08-17&#xff09;山西電力市場全天平均日前電價為376.70元/MWh。其中&#xff0c;最高日前電價為431.75元/MWh&#xff0c;預計出現在19: 45。最低日前電價為339.25元/MWh&#xff0c;預計出現在13: 15。 價差方向預測 1&#xff1a; 實…

python實現抽獎小程序

使用Python的Tkinter庫來添加抽獎程序的界面操作。下面是一個示例代碼&#xff1a; import random import tkinter as tkdef lottery():prizes [一等獎, 二等獎, 三等獎, 謝謝參與]winner random.choice(prizes)result_label.config(text恭喜您獲得了{}&#xff01;.format(…

未出現過的最小正整數

給定一個長度為 n 的整數數組&#xff0c;請你找出未在數組中出現過的最小正整數。 樣例 輸入1&#xff1a;[-5, 3, 2, 3]輸出1&#xff1a;1輸入2&#xff1a;[1, 2, 3]輸出2&#xff1a;4數據范圍 1≤n≤105 , 數組中元素的取值范圍 [?109,109]。 代碼&#xff1a; c…

MySql主從復制1032錯誤(Slave_IO_Running: Yes Slave_SQL_Running: No)

MySql主從復制1032錯誤&#xff08;Slave_IO_Running: Yes Slave_SQL_Running: No&#xff09; Slave_IO_Running: Yes Slave_SQL_Running: No報錯&#xff1a; Last_SQL_Error: Could not execute Delete_rows event on table hr.test; Can’t find record in ‘test’, Erro…

【Unity造輪子】制作一個簡單的2d抓勾效果(類似蜘蛛俠的技能)

文章目錄 前言開始1. 實現簡單的抓勾效果2. 高階鉤爪效果 源碼參考完結 前言 歡迎閱讀本文&#xff0c;本文將向您介紹如何使用Unity游戲引擎來實現一個簡單而有趣的2D抓勾效果&#xff0c;類似于蜘蛛俠的獨特能力。抓勾效果是許多動作游戲和平臺游戲中的常見元素&#xff0c;…

【AI繪畫】3分鐘學會ikun幻術圖

目錄 前言一、效果展示二、準備工作三、操作步驟3.1平臺創建實例3.2 啟動SD 四、安裝QR Code Monster 模型五、成圖 前言 大家熱愛的ikun幻術在今天的分享中將呈現。在本文中&#xff0c;我們將揭示一個備受歡迎的圖像幻術技術&#xff0c;讓您感受到令人驚嘆的視覺創造力。 …

springboot+vue游戲攻略推薦網站的設計與開發_s5832

熱門網游推薦網站是一個利用JAVA技術建設的網上管理系統&#xff0c;在熱門網游推薦管理中實現信息化。系統的設計就是為了迎合廣大用戶需求而創建的一個界面簡潔、有定向內容、業務邏輯簡單易操作的熱門網游推薦網站。本文以熱門網游推薦為例&#xff0c;提出了利用JAVA技術設…