MySQL——表的約束

表約束

一、概念

? 表中一定要有各種約束,通過各種約束使得未來插入到數據庫中的數據是合法的,在語法上是沒有問題的;

? 約束本質就是通過技術手段,倒逼著程序員插入正確的數據,換句話說就是,插入進來的數據一定是符合數據約束的;最終保證數據的完整性和可預期性;

二、非空約束

select null;#NULL表示沒有,不區分大小寫;

在這里插入圖片描述

select 1+null;#實際上null是不會參與計算的

在這里插入圖片描述

? 空屬性有兩個值,分別是null(默認值)和not null;創建表時除了寫表屬性和類型之外還可以添加null和not null分別表示允許為空和不允許為空;

在這里插入圖片描述

? Null列表示是否啟用空屬性約束;默認約束是Null,由于不啟用空約束所以就不允許插入缺省值了;

三、默認約束

? 常用的某一個具體值,可以一開始就指定好,用戶需要顯式傳遞時允許用戶傳入其需求值;

? default和not NULL并不沖突,當用戶顯示插入對應屬性時,可以插入NULL或者合法數據,當不插入數據時,如果設置了default就會自動插入缺省值,沒設置就必須用戶顯示插入;

? MySQL默認的default值是NULL;

四、comment約束

? 相當于屬性字段的注釋,用于程序員和DBA進行了解;

create table 表名(屬性名 屬性類型 非空約束 默認約束 comment '屬性注釋');

五、zerofill約束

create table 表名(屬性名 屬性類型 非空約束 默認約束 comment '屬性注釋'zerofill);
#zerofill表示是否啟用;

? 關于顯示方面的約束;如果顯示的寬度小于指定的寬度,使用zerofill填充之后就會使用0填充指定的寬度;如果數據的寬度大于zerofill約束指定寬度,還是可以正常顯示,所以zerofill是一種至少的行為;

? int是4個字節,無符號顯示出來就是十個位,有符號還有符號位所以是十一位;

六、主鍵約束

? 主鍵:primary key用來唯一約束該字段里面的數據,不能重復,不能為空,一張表里面只能有一個主鍵;

create table 表名(屬性名 屬性類型 非空約束 默認約束 zerofill primary key comment '屬性注釋');
create table 表名(屬性名 屬性類型 非空約束 默認約束 zerofill comment '屬性注釋',primary key('屬性名'));

? 存在的意義就是:使得屬性唯一標識,不可以被修改,便于增刪查改;

alter table 表名 add primary key(屬性字段);
alter table 表名 drop primary key;

? 主鍵也可以添加到多列,即復合主鍵,仍然是一個主鍵;

? 嚴格的按照一對一的關系,不允許同一個記錄重復出現;

6.1自增長約束

? auto_increment是主鍵的一種,插入數據時可以不用考慮它,每次在插入數據時都會自動地進行最大數據加一;**自增長約束一般都必須設置成主鍵;自增長字段必須是整數;一張表只能有一個自增長;**常用于索引;

create table if not exists t2(id int unsigned primary key auto_increment,name varchar(20) not null
)auto_increment=5;Create Table: CREATE TABLE `t2` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
#除了表內屬性進行了優化,表外屬性也自動添加AUTO_INCREMENT=5,表明下一次插入時會使用的主鍵值;每次插入玩=完成之后會更新AUTO_INCREMENT字段;

? 補充:索引的本質就是以空間換時間,為kv映射關系提供了專門的空間,便于快速定位;索引和主鍵相關

七、唯一鍵約束

create table t3(id char(20) unique comment '這是一個學生的唯一鍵學號',name varchar(32) not null
);Create Table: CREATE TABLE `t3` (`id` char(20) DEFAULT NULL COMMENT '這是一個學生的唯一鍵學號',`name` varchar(32) NOT NULL,UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | char(20)    | YES  | UNI | NULL    |       |
| name  | varchar(32) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

? 唯一鍵與逐漸最大的不同就是可以為空,并且空可以重復;

? 他們之間互為補充,其中選擇了主鍵作為索引,但是其他的屬性邏輯上也要保證唯一性,所以需要有唯一鍵來保證唯一性;

八、外鍵約束

? 外鍵常用于主表和從表之間建立聯系;即從表中有屬性與主表的主鍵或者唯一鍵屬性相關聯,此時就需要使用外鍵建立聯系;

create table if not exists student(id int primary key,name varchar(20) not null,telephone varchar(20) unique key,class_id int,foreign key(class_id) references class(id)
);Create Table: CREATE TABLE `student` (`id` int(11) NOT NULL,`name` varchar(20) NOT NULL,`telephone` varchar(20) DEFAULT NULL,`class_id` int(10) unsigned DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `telephone` (`telephone`),KEY `class_id` (`class_id`),CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int(11)          | NO   | PRI | NULL    |       |
| name      | varchar(20)      | NO   |     | NULL    |       |
| telephone | varchar(20)      | YES  | UNI | NULL    |       |
| class_id  | int(10) unsigned | YES  | MUL | NULL    |       |
+-----------+------------------+------+-----+---------+-------+

? 外鍵既可以保證從表插入時,需要符合約束條件,也可以保證從表外鍵約束有數據時不可以刪除主表內容;

? 定義外鍵時必須保證外鍵列數據在主表中存在或者為空;

九、綜合案例

? 約束會保證凡是進入mysql中的數據一定是符合規定的;

一個商店的數據記錄客戶端及客戶購物情況,由三個表組成;

? 商品goods(商品編號goods_id,商品名goods——name,單價unitprice,商品類別category,供應商provider);

? 客戶customer(客戶號customer_id,姓名name,住址address,郵箱email,性別sex,身份證card_id);

? 購買purchase(購買訂單號order_id,客戶號customer_id,商品號goods_id,購買數量nums);

要求:

? 每個表的主外鍵;

? 客戶的姓名不能為空值;

? 郵箱不能重復;

? 客戶的性別(男,女);

-- 創建數據庫
create database if not exists bit32mall
default character set utf8 ;
-- 選擇數據庫
use bit32mall;
-- 創建數據庫表
-- 商品
create table if not exists goods
(goods_id int primary key auto_increment comment '商品編號',goods_name varchar(32) not null comment '商品名稱',unitprice int not null default 0 comment '單價,單位分',category varchar(12) comment '商品分類',provider varchar(64) not null comment '供應商名稱'
);
-- 客戶
create table if not exists customer
(customer_id int primary key auto_increment comment '客戶編號',name varchar(32) not null comment '客戶姓名',address varchar(256) comment '客戶地址',email varchar(64) unique key comment '電子郵箱',sex enum('男','女') not null comment '性別',card_id char(18) unique key comment '身份證'
);
-- 購買
create table if not exists purchase
(order_id int primary key auto_increment comment '訂單號',customer_id int comment '客戶編號',goods_id int comment '商品編號',nums int default 0 comment '購買數量',foreign key (customer_id) references customer(customer_id),foreign key (goods_id) references goods(goods_id)
);

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

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

相關文章

6個精品免費wordpress模板下載

要找到視覺效果非常出色的WordPress模板,我們可以從多個角度來考慮。根據《Smashing WordPress Themes: Making WordPress Beautiful》一書,WordPress不僅僅是一個博客平臺,它還能被用來創建各種風格的網站,從企業網站到攝影畫廊等…

洗地機哪個牌子好?全面評測多款口碑洗地機

洗地機的出現,讓人們擺脫了每天打掃衛生的繁瑣,因為它只需輕輕一推,就能把掃地、拖地、擦地的活全做了,干垃圾濕垃圾統統都能一次清理干凈,操作簡單,更輕松。本文主要分享一些挑選洗地機的技巧,…

python報錯ImportError: The _imagingft C module is not installed

前言 以下解決方案來自gpt,但親測有效,uu們可放心食用 解決方法 ImportError: The _imagingft C module is not installed 錯誤通常表明你的Python環境中缺少用于處理圖像字體的模塊。這可能是由于Pillow(PIL的分支)庫未正確安…

大數據運維學習筆記之Ambari——筑夢之路

原則:分布式存儲和分布式計算分開 今天就到這里啦。

c語言如何向文件寫入字符串

c語言里向文件寫入字符串&#xff0c;用到fputs語句 fputs&#xff08;str,fp&#xff09;是將str字符數組里的內容寫入到fp指針指向的文件 #include<stdio.h>int main() {FILE *fp;char s[100];fpfopen("ddd.txt","w");fputs("good time\n&q…

PostgreSQL 的pg_rman 和 Oracle 的 RMAN 對比

PostgreSQL 的pg_rman和 Oracle 的 RMAN 對比 PostgreSQL 的pg_rman 和 Oracle 的 RMAN&#xff08;Recovery Manager&#xff09;都是數據庫備份和恢復管理工具&#xff0c;分別用于 PostgreSQL 和 Oracle 數據庫。盡管它們的目的和某些功能類似&#xff0c;但在許多方面也存…

【HarmonyOS4學習筆記】《HarmonyOS4+NEXT星河版入門到企業級實戰教程》課程學習筆記(十)

課程地址&#xff1a; 黑馬程序員HarmonyOS4NEXT星河版入門到企業級實戰教程&#xff0c;一套精通鴻蒙應用開發 &#xff08;本篇筆記對應課程第 17 節&#xff09; P17《16.Ark-狀態管理Prop Link Provide Consume》 將上一節寫出的代碼進行功能模塊封裝&#xff1a;1、任務…

【退役之重學Java】關于 Nacos 注冊中心

一、下載&#xff0c;安裝 見官網 二、配置 流程&#xff1a; 建module&#xff0c;pom&#xff0c;yml&#xff0c;主啟動&#xff0c;業務類 三、功能 負載均衡&#xff1a; Nacos 整合 Ribbon&#xff0c;可以使用 RestTemplate Nacos整合了Ribbon后&#xff0c;可以使用Res…

一個通過ADC采集NTC熱敏電阻的溫度傳感器

前言: 如何設計一個電路,使用具有逐次逼近寄存器(SAR)模數轉換器(ADC)的熱敏電阻直接監測溫度呢?溫度傳感電路需要使用負溫度系數(NTC)熱敏電阻與電阻器串聯形成分壓器,監測-25C至100C的溫度范圍。分壓器具有產生與監測的溫度成反比的輸出電壓的效果。電阻器分壓器的…

如何徹底搞懂迭代器(Iterator)設計模式?

說起迭代器&#xff08;Iterator&#xff09;&#xff0c;相信你并不會陌生&#xff0c;因為我們幾乎每天都在使用JDK中自帶的各種迭代器。那么&#xff0c;這些迭代器是如何構建出來的呢&#xff1f;就需要用到了今天內容要介紹的迭代器設計模式。在日常開發過程中&#xff0c…

查找效率滿分的算法—— “二分查找” 算法 (Java版)

本篇會加入個人的所謂魚式瘋言 ??????魚式瘋言:??????此瘋言非彼瘋言 而是理解過并總結出來通俗易懂的大白話, 小編會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能說的不是那么嚴謹.但小編初心是能讓更多人…

removeAttribute和removeAttributeNode有什么區別(代碼舉例說明)

removeAttribute 和 removeAttributeNode 都是用于從 HTML 元素中移除屬性的 DOM 方法&#xff0c;但它們在用法和接受的參數上有一些區別。 removeAttribute removeAttribute 是一個元素&#xff08;Element&#xff09;對象的方法&#xff0c;它接受一個字符串參數&#xf…

深入了解Nginx(一):Nginx核心原理

一、Nginx核心原理 本節為大家介紹Nginx的核心原理,包含Reactor模型、Nginx的模塊化設計、Nginx的請求處理階段. &#xff08;本文源自微博客,且已獲得授權&#xff09; 1.1、Reactor模型 Nginx對高并發IO的處理使用了Reactor事件驅動模型。Reactor模型的基本組件包含時間收集…

華為OBS命令行簡單使用

華為OBS&#xff08;Object Storage Service&#xff09;是一種云存儲服務&#xff0c;提供了高可靠、高性能、安全的數據存儲能力。通過使用OBS的命令行工具obsutil&#xff0c;用戶可以方便地進行文件上傳、下載、刪除等操作&#xff0c;而無需依賴圖形界面。下面&#xff0c…

使用xsd驗證xml格式的正確性

1.1 基礎知識介紹 XML簡介&#xff1a;XML是可擴展標記語言&#xff08;eXtensible Markup Language&#xff09;的縮寫&#xff0c;它是一種數據表示格式&#xff0c;可以描述非常復雜的數據結構&#xff0c;常用于傳輸和存儲數據。xml文件、xml消息。XSD簡介&#xff1a;是X…

oracle 表同一列只取最新一條數據寫法

select * from (select t.*,row_number() over(partition by 去重列名 order by 排序列名 desc) as rnfrom 表名)where rn1 1.row_number() over(....): 為每條數據分配一個行號,1.2.3....這樣的 2.partition by : 以某列作為分組&#xff0c;每個分組行號從1開始&#xf…

ComputerLab實例2.0(繼承)

要求&#xff1a; Write a computer program that could be used to track users activities. Lab NumberComputer Station Numbers11-321-431-541-6 ? You run four computer labs. Each lab contains computer stations that are numbered as the above table. ? There…

LabVIEW和ZigBee無線溫濕度監測

LabVIEW和ZigBee無線溫濕度監測 隨著物聯網技術的迅速發展&#xff0c;溫濕度數據的遠程無線監測在農業大棚、倉庫和其他需環境控制的場所變得日益重要。開發了一種基于LabVIEW和ZigBee技術的多區域無線溫濕度監測系統。系統通過DHT11傳感器收集溫濕度數據&#xff0c;利用Zig…

uniapp-自定義navigationBar

封裝導航欄自定義組件 創建 nav-bar.vue <script setup>import {onReady} from dcloudio/uni-appimport {ref} from vue;const propsdefineProps([navBackgroundColor])const statusBarHeight ref()const navHeight ref()onReady(() > {uni.getSystemInfo({success…

圖生代碼,從Hello Onion 代碼開始

從Hello Onion 代碼開始 1&#xff0c;從代碼開始 原生語言采用java 作為載體。通過注解方式實現“UI可視化元素"與代碼bean之間的映射. 轉換示例 2&#xff0c;運行解析原理 在執行JAVA代碼期間&#xff0c;通過讀取注解信息&#xff0c;轉換為前端的JSON交由前端JS框…