09-完整性約束

本節重點:

  • not null 與 default
  • unique
  • primary
  • auto_increment
  • foreign key

?

?

一、介紹

約束條件與數據類型的寬度一樣,都是可選參數

作用:用于保證數據的完整性和一致性

主要分為:

復制代碼
PRIMARY KEY (PK)    #標識該字段為該表的主鍵,可以唯一的標識記錄
FOREIGN KEY (FK)    #標識該字段為該表的外鍵
NOT NULL    #標識該字段不能為空
UNIQUE KEY (UK)    #標識該字段的值是唯一的
AUTO_INCREMENT    #標識該字段的值自動增長(整數類型,而且為主鍵)
DEFAULT    #為該字段設置默認值UNSIGNED #無符號
ZEROFILL #使用0填充
復制代碼

說明:

復制代碼
#1. 是否允許為空,默認NULL,可設置NOT NULL,字段不允許為空,必須賦值
#2. 字段是否有默認值,缺省的默認值是NULL,如果插入記錄時不給字段賦值,此字段使用默認值
sex enum('male','female') not null default 'male'#必須為正值(無符號) 不允許為空 默認是20
age int unsigned NOT NULL default 20 
# 3. 是否是key
主鍵 primary key
外鍵 foreign key
索引 (index,unique...)
復制代碼

?

二、not null 與default

是否可空,null表示空,非字符串
not null - 不可空
null - 可空

默認值,創建列時可以指定默認值,當插入數據時如果未主動設置,則自動添加默認值

create table tb1(nid int not null defalut 2,num int not null);

?

驗證1:

?

?默認值可以為空

?

?

驗證2:

?設置not null,插入值時不能為空

?

驗證3:

?設置id字段有默認值后,則無論id字段是null還是not null,都可以插入空,插入空默認填入default指定的默認值

?

小練習:

創建學生表student2,設置每個字段的約束條件。

復制代碼
mysql> create table student2(-> id int not null,-> name varchar(50) not null,-> age int(3) unsigned not null default 18,-> sex enum('male','female') default 'male',-> fav set('smoke','drink','tangtou') default 'drink,tangtou'-> );
Query OK, 0 rows affected (0.01 sec)# 只插入了not null約束條件的字段對應的值
mysql> insert into student2(id,name) values(1,'mjj');
Query OK, 1 row affected (0.00 sec)# 查詢結果如下
mysql> select * from student2;
+----+------+-----+------+---------------+
| id | name | age | sex  | fav           |
+----+------+-----+------+---------------+
|  1 | mjj  |  18 | male | drink,tangtou |
+----+------+-----+------+---------------+
1 row in set (0.00 sec)
復制代碼

?

3、unique

中文翻譯:不同的。在mysql中稱為單列唯一

?

舉例說明:創建公司部門表(每個公司都有唯一的一個部門)。

?驗證之前重復插入記錄的操作是可行的,但是不符合場景

?

接下來,使用約束條件unique,來對公司部門的字段進行設置。

復制代碼
#第一種創建unique的方式
#例子1:
create table department(id int,name char(10) unique
);
mysql> insert into department values(1,'it'),(2,'it');
ERROR 1062 (23000): Duplicate entry 'it' for key 'name'#例子2:
create table department(id int unique,name char(10) unique
);
insert into department values(1,'it'),(2,'sale');#第二種創建unique的方式
create table department(id int,name char(10) ,unique(id),unique(name)
);
insert into department values(1,'it'),(2,'sale');
復制代碼

?

聯合唯一:

復制代碼
# 創建services表
mysql> create table services(-> id int,-> ip char(15),-> port int,-> unique(id),-> unique(ip,port)-> );
Query OK, 0 rows affected (0.05 sec)mysql> desc services;
+-------+----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id        | int(11)   | YES   | UNI  | NULL       |             |
| ip        | char(15) | YES   | MUL  | NULL       |             |
| port    | int(11) | YES   |          | NULL       |             |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)#聯合唯一,只要兩列記錄,有一列不同,既符合聯合唯一的約束
mysql> insert into services values-> (1,'192,168,11,23',80),-> (2,'192,168,11,23',81),-> (3,'192,168,11,25',80);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from services;
+------+---------------+------+
| id   | ip            | port |
+------+---------------+------+
|    1 | 192,168,11,23 |   80 |
|    2 | 192,168,11,23 |   81 |
|    3 | 192,168,11,25 |   80 |
+------+---------------+------+
3 rows in set (0.00 sec)mysql> insert into services values (4,'192,168,11,23',80);
ERROR 1062 (23000): Duplicate entry '192,168,11,23-80' for key 'ip'
復制代碼

?

4.primary key

一個表中可以:

單列做主鍵
多列做主鍵(復合主鍵)

約束:等價于 not null unique,字段的值不為空且唯一

存儲引擎默認是(innodb):對于innodb存儲引擎來說,一張表必須有一個主鍵。

單列主鍵

復制代碼
# 創建t14表,為id字段設置主鍵,唯一的不同的記錄
create table t14(id int primary key,name char(16)
);insert into t14 values
(1,'xiaoma'),
(2,'xiaohong');mysql> insert into t14 values(2,'wxxx');
ERROR 1062 (23000): Duplicate entry '6' for key 'PRIMARY'#   not null + unique的化學反應,相當于給id設置primary key
create table t15(id int not null unique,name char(16)
);
mysql> create table t15(-> id int not null unique,-> name char(16)-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t15;
+-------+----------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id        | int(11)  | NO     | PRI | NULL       |             |
| name   | char(16) | YES  |         | NULL       |             |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.02 sec)
復制代碼

?

復合主鍵

?驗證復合主鍵的使用

?

5.auto_increment

約束:約束的字段為自動增長,約束的字段必須同時被key約束

?

(重點)驗證:

?不指定id,則自動增長

?

?也可以指定id

?

?對于自增的字段,在用delete刪除后,再插入值,該字段仍按照刪除前的位置繼續增長

?

了解:

?auto_increment_increment和 auto_increment_offset

?

清空表區分delete和truncate的區別:

delete from t1; #如果有自增id,新增的數據,仍然是以刪除前的最后一樣作為起始。

truncate table t1;數據量大,刪除速度比上一條快,且直接從零開始。

?

6.foreign key

?

一 快速理解foreign key

之前創建表的時候都是在一張表中添加記錄,比如如下表:

?

公司有3個部門,但是有1個億的員工,那意味著部門這個字段需要重復存儲,部門名字越長,越浪費。

這個時候,

解決方法:

我們完全可以定義一個部門表

然后讓員工信息表關聯該表,如何關聯,即foreign key

我們可以將上表改為如下結構:

?

此時有兩張表,一張是employee表,簡稱emp表(關聯表,也就從表)。一張是department表,簡稱dep表(被關聯表,也叫主表)。

?

創建兩張表操作:

?View Code

?

上面的刪除表記錄的操作比較繁瑣,按道理講,裁掉一個部門,該部門的員工也會被裁掉。其實呢,在建表的時候還有個很重要的內容,叫同步刪除,同步更新

接下來將剛建好的兩張表全部刪除,先刪除關聯表(emp),再刪除被關聯表(dep)

接下來:
重復上面的操作建表
注意:在關聯表中加入
on delete cascade #同步刪除
on update cascade #同步更新

修改emp表:

復制代碼
create table emp(id int primary key,name varchar(20) not null,age int not null,dep_id int,constraint fk_dep foreign key(dep_id) references dep(id) on delete cascade #同步刪除on update cascade #同步更新
);
復制代碼

接下來的操作,就復合我們正常的生活中的情況了。

復制代碼
#再去刪被關聯表(dep)的記錄,關聯表(emp)中的記錄也跟著刪除
mysql> delete from dep where id=3;
Query OK, 1 row affected (0.00 sec)mysql> select * from dep;
+----+-----------+----------------------+
| id | name      | descripe             |
+----+-----------+----------------------+
|  1 | IT        | IT技術有限部門       |
|  2 | 銷售部    | 銷售部門             |
+----+-----------+----------------------+
2 rows in set (0.00 sec)mysql> select * from emp;
+----+----------+-----+--------+
| id | name     | age | dep_id |
+----+----------+-----+--------+
|  1 | zhangsan |  18 |      1 |
|  2 | lisi     |  19 |      1 |
|  3 | egon     |  20 |      2 |
|  5 | alex     |  18 |      2 |
+----+----------+-----+--------+
4 rows in set (0.00 sec)#再去更改被關聯表(dep)的記錄,關聯表(emp)中的記錄也跟著更改mysql> update dep set id=222 where id=2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0# 趕緊去查看一下兩張表是否都被刪除了,是否都被更改了
mysql> select * from dep;
+-----+-----------+----------------------+
| id  | name      | descripe             |
+-----+-----------+----------------------+
|   1 | IT        | IT技術有限部門       |
| 222 | 銷售部    | 銷售部門             |
+-----+-----------+----------------------+
2 rows in set (0.00 sec)mysql> select * from emp;
+----+----------+-----+--------+
| id | name     | age | dep_id |
+----+----------+-----+--------+
|  1 | zhangsan |  18 |      1 |
|  2 | lisi     |  19 |      1 |
|  3 | egon     |  20 |    222 |
|  5 | alex     |  18 |    222 |
+----+----------+-----+--------+
4 rows in set (0.00 sec)

轉載于:https://www.cnblogs.com/zsdbk/p/9196459.html

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

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

相關文章

fread rb與r,wb,w的區別

在fread時,"rb"與"r"對某些字符作用,是不同的; 文本模式和二進制模式讀取不一樣的 文本:讀: 遇到回車-換行(0D 0A),就會轉換為換行符0A 寫:遇到換行符0A,就會轉換為回車-換…

軟件正向工程

正向工程是通過實現語言的映射而把模型轉換為代碼的過程。正向工程也稱為革新或改造,這項活動不僅從現有程序中恢復設計信息,而且使用該信息去改變或重構現有系統,以提高其整體質量。 換句話說:一般工業產品開發是從確定預期功能…

學成在線--2.CMS前端頁面查詢開發

文章目錄0.思路總結1.創建CMS模塊的目錄架構2.創建頁面并配置路由1)在page目錄新建page_list.vue,擴展名為.vue。2)在cms的router下配置路由。3)在base目錄下的router導入cms模塊的路由3.使用Table組件完善頁面內容4.Api調用服務器…

java.util.IdentityHashMap.entrySet()方法實例

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 entrySet() 方法是用來獲取此映射中包含的映射關系的set視圖。 聲明 以下是java.util.IdentityHashMap.entrySet()方法的聲明。 publ…

URL轉微信可識別的二維碼

jquery.qrcode.js 是一個能夠在客戶端生成矩陣二維碼QRCode 的jquery插件 &#xff0c;使用它可以很方便的在頁面上生成二維條碼。 用法&#xff1a; 1、引入jquery.qrcode.min.js <script src"jquery.min.js"></script> <script src"jquery.qrc…

javascript數組及操作方法

數組及操作方法 數組就是一組數據的集合&#xff0c;javascript中&#xff0c;數組里面的數據可以是不同類型的。 定義數組的方法 //對象的實例創建 var aList new Array(1,2,3);//直接量創建 var aList2 [1,2,3,asd];操作數組中數據的方法 1、獲取數組的長度&#xff1a;aLi…

如何創建比C語言更快的編程語言?

【CSDN編譯整理】近日&#xff0c;beza1e1上發表了一篇博客《Faster than C》&#xff0c;在Hacker News和Reddit Programming上引發了開發者們的激烈討論。現將此文編譯&#xff0c;我們一起來探討下。 單從編程語言特性來判斷&#xff0c;雖然Fortran語言也以快而著稱&#…

面向對象方法學

面向對象技術強調在軟件開發過程中面向客觀世界或問題域中的事物&#xff0c;采用人類在認識客觀世界的過程中普遍運用的思維方法&#xff0c;直觀、自然地描述客觀世界中的有關事物。 面向對象的分析方法是利用面向對象的信息建模概念&#xff0c;如實體、關系、屬性等&#x…

學成在線--3.CMS頁面管理開發(自定義條件查詢)

文章目錄0.需求分析1.服務端--Dao2.服務端--Service3.服務端--Controller4.前端1&#xff09;page_list.vue中增加查詢表單2&#xff09;page_list.vue中添加數據模型對象3&#xff09;在鉤子方法中構建siteList站點列5.Api調用1&#xff09;修改 cms.js&#xff0c;向服務端傳…

動態生成表格、隱藏表格、選中刪除任意行、jquery、輸入驗證

PS&#xff1a; 游戲公司后臺開發&#xff0c;工作模式&#xff1a;996。 于是寫博客這事也荒廢了.... 想想還是寫一點吧。 呵呵&#xff0c;請不要笑話我注釋寫這么多&#xff0c;習慣了&#xff0c;我上班寫代碼都是有注釋的。 我建兩個相似的表是為了&#xff0c;給后臺使…

安裝 PrestaShop 1.6 - 詳細的安裝指南

2019獨角獸企業重金招聘Python工程師標準>>> 詳細的安裝指南 下載和解壓 PrestaShop 程序代碼包 你可以從 PrestaShop 官方下載最新的版本&#xff0c;下載地址為&#xff1a;http://www.prestashop.com/en/download. 這里你只有一個選項&#xff0c;只能下載最新的…

tinydate.js[v0.3] 新增了字符串格式化為日期對象的函數

更新說明 加入了String類型的擴展成員 convertToDate() 可以直接將 字符串格式的日期轉換為Date對象。加入了String類型的擴展成員 convertToTimeSpan() 可以將 字符串格式的日期轉換為TimeSpan對象。修復了日期格式化為字符串的format函數中的bug。tinydate.js v0.3 Date.prot…

面向對象方法學的四個要點

面向對象方法學的要點面向對象方法學的出發點和基本原則&#xff0c;是盡可能模擬人類習慣的思維方式&#xff0c;使開發軟件的方法與過程盡可能接近人類認識世界解決問題的方法與過程&#xff0c;也就是使描述問題的問題空間(也稱為問題域)與實現解法的解空間(也稱為求解域)在…

學成在線--4.CMS頁面管理開發(新增頁面)

文章目錄1.定義新增頁面接口1&#xff09;在model工程中定義響應模型2&#xff09;在api工程中添加接口2.新增頁面服務端開發1&#xff09;Dao2&#xff09;Service3&#xff09;Controller3.新增頁面前端開發1&#xff09;創建page_add.vue2&#xff09;配置路由3&#xff09;…

嵌套For循環性能優化

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。1 案例描述某日&#xff0c;在JavaEye上看到一道面試題&#xff0c;題目是這樣的&#xff1a;請對以下的代碼進行優化 Java代碼 for (int …

docker-ce安裝

1、安裝 sudo yum -y install docker 2、加入開機自啟systemctl enable docker轉載于:https://www.cnblogs.com/runnerjack/p/8618524.html

python-study-17

復習 上節課復習1、什么是模塊模塊是一系列功能的集合體2、為何用模塊拿來&#xff08;內置或第三方的模塊&#xff09;主義&#xff0c;提升開發效率自定義模塊可以讓程序的各部分組件重用模塊內的功能3、如何用模塊大前提&#xff1a;模塊是被執行文件導入使用&#xff0c;模…

面向對象方法學的優點

1.與人類習慣的思維方法一致面向對象的軟件技術以對象為核心&#xff0c;用這種技術開發出的軟件系統由對象組成。對象是由描述內部狀態表示靜態屬性的數據&#xff0c;以及可以對這些數據施加的操作(對象的動態行為)&#xff0c;封裝在一起所構成的統一體。面向對象的設計方法…

如何學好C語言

我相信&#xff0c;這可能是很多朋友的問題&#xff0c;我以前也有這樣的感覺&#xff0c;編程編到一定的時候&#xff0c;發現能力到了瓶頸&#xff0c;既不深&#xff0c;也不扎實&#xff0c;半吊子。比如&#xff1a;你長期地使用Java和.NET &#xff0c;這些有虛擬機的語言…

學成在線--5.CMS頁面管理開發(修改頁面)

文章目錄1.修改頁面流程1&#xff09;前端邏輯2&#xff09;后端邏輯2.修改頁面接口定義3.后端開發--Dao4.后端開發--Service5.后端開發--Controller1&#xff09;根據id查詢頁面2&#xff09;保存頁面信息6.前端開發--頁面處理流程7.前端開發--編寫page_edit.vue8.前端開發--配…