最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)庫(kù)的約束與設(shè)計(jì)解讀

 更新時(shí)間:2026年01月08日 09:57:01   作者:蘇小瀚  
文章介紹了數(shù)據(jù)庫(kù)的約束類型,包括非空約束、默認(rèn)約束、唯一約束、主鍵約束、外鍵約束和check約束,并介紹了數(shù)據(jù)庫(kù)設(shè)計(jì)的三大范式:第一范式、第二范式和第三范式,還介紹了如何根據(jù)業(yè)務(wù)需求進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)和創(chuàng)建實(shí)體-關(guān)系圖

1.數(shù)據(jù)庫(kù)的約束

1.1 定義

數(shù)據(jù)庫(kù)的約束是對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)施加的規(guī)則或者條件,確保數(shù)據(jù)的準(zhǔn)確性和可靠性。

1.2 約束類型

1.3 非空約束(not null)

not null 約束是在定義某一列屬性時(shí),設(shè)置該列的數(shù)據(jù)不能為空。

create table teacher(
	id bigint,
	name varchar(20) not null
);

這里我們就定義了name這個(gè)屬性列的數(shù)據(jù)不能為空。

1.4 默認(rèn)約束(default)

default 是指定一個(gè)列的屬性,插入時(shí)候沒(méi)有定義具體的值,此時(shí)就使用定義的默認(rèn)值。z

create table teacher(
id bigint,
name varchar(20),
age bigint default 18
);

這里我們?cè)赼ge屬性后面加上默認(rèn)值18,這樣我們?cè)诓迦胍粭l數(shù)據(jù)時(shí)候,沒(méi)有插入age的數(shù)據(jù),就填默認(rèn)值18。

1.5 唯一約束(unique)

unique用來(lái)約束列的屬性,保證列的數(shù)據(jù)不相同,具有唯一性??罩岛涂罩抵g是不算做重復(fù)的。

create table teacher(
id bigint,
name varchar(20),
age bigint default 18,
sno varchar(20) unique
);

這里我們定義sno(學(xué)號(hào))列的屬性是唯一的。

1.6 主鍵約束(primary key)

primary key 用來(lái)表示某一列是主鍵,一個(gè)表中只能有一個(gè)主鍵,其作用相當(dāng)于unique 和 not null的結(jié)合。

一般一些具有身份表示的屬性定義為主鍵,比如說(shuō)老師的id,這里就可以id作為每個(gè)老師的身份標(biāo)識(shí)。

create table teacher(
id bigint primary key,
name varchar(20),
age bigint default 18,
sno varchar(20) unique
);

這里的主鍵我們可以將多個(gè)屬性結(jié)合作為一個(gè)主鍵:

create table teacher(
id bigint,
name varchar(20),
age bigint,
sno varchar(20)
primary key(id,name)
);

1.6.1 自增主鍵(auto_increment)

自增主鍵利用primary key auto_increment來(lái)定義的,針對(duì)一些整數(shù)類型的列可以自己增加大小,每次+1,每次都是在該列中最大的值的基礎(chǔ)上+1的。

create table teacher(
    id bigint primary key auto_increment,
    name varchar(20)
);

如果一個(gè)學(xué)生表的數(shù)據(jù)很大,id為自增主鍵,這里將表分配到兩個(gè)服務(wù)器上面,這時(shí)候自增主鍵就不能確保兩個(gè)服務(wù)器中的數(shù)據(jù)還是唯一的,這時(shí)候我們就要利用一些算法來(lái)生成 唯一主鍵。

下面列舉一種唯一主鍵的設(shè)定:

設(shè)置一個(gè)字符串id 表示唯一主鍵,字符串由 時(shí)間戳,機(jī)器編號(hào),隨機(jī)因子等組成字符串,然后再求出一個(gè)哈希值,就可以得到一個(gè)唯一主鍵了。

1.7 外鍵約束(foreign key)

外鍵約束使用的是foreign key關(guān)鍵字,表示兩個(gè)表之間的約束關(guān)系。

這里我們創(chuàng)建兩張表學(xué)生表和班級(jí)表:

create table student(s_id int, s_name varchar(20), s_sex varchar(20), class_id int);

insert into student values (1,'張三','男',1);
insert into student values (2,'李四','女',2);
insert into student values (3,'王五','男',3);

create table class(class_id int, class_name varchar(20));

insert into class values (1,'一班');
insert into class values (2,'二班');
insert into class values (3,'三班');

這兩張表沒(méi)有添加外鍵依賴的時(shí)候,可以正常插入,但是在學(xué)生表的class_id加上外鍵約束(foreign key),后,此時(shí)兩個(gè)表就關(guān)聯(lián)起來(lái)了。

create table student(s_id int, s_name varchar(20), s_sex varchar(20), class_id int, foreign key (class_id) references class (class_id));

外鍵約束:

foreign key (學(xué)生表的外鍵) references 班級(jí)表表名 班級(jí)表的主鍵;

此時(shí)的班級(jí)表約束學(xué)生表,也就是說(shuō)學(xué)生表依賴(聽(tīng))班級(jí)表的。

此時(shí)學(xué)生表在進(jìn)行插入和修改操作的時(shí)候,就要注意class_id是否合法。不合法的話會(huì)報(bào)錯(cuò)。此時(shí)會(huì)先查詢班級(jí)表中是否有class_id的數(shù)據(jù)。

此時(shí)班級(jí)表在進(jìn)行刪除和修改操作的時(shí)候,需要注意該操作是否合法,會(huì)先查詢下學(xué)生表是否有使用了班級(jí)表這行要?jiǎng)h除或者需修改操作的行

create table student(
	id int, name varchar(20), sex varchar(10), age int,
	check (age > 18),
	check (sex = '男' or sex = '女')
	);

注意:這里的外鍵約束所依賴的外鍵的列屬性必須要有索引,而主鍵約束默認(rèn)有索引。

此時(shí)有一個(gè)問(wèn)題:

假設(shè)有一個(gè)商品表和一個(gè)訂單表,訂單表依賴于商品表的商品id。此時(shí)我們?nèi)绾蜗录苌唐纺兀?/strong>

因?yàn)榇藭r(shí)訂單表中使用著當(dāng)前的商品id,所以當(dāng)前的該商品不能從商品表中直接刪除,那我們可以邏輯刪除,我們可以在商品表中加一列,boolean類型來(lái)判斷該商品是否被下架,而訂單表在創(chuàng)建新的訂單時(shí)候where下是否這個(gè)列的屬性是否表示未下架。

1.8 check約束

check約束只支持sql8版本,sql5.7不支持,sql5.7 在使用check約束時(shí)候,不會(huì)報(bào)錯(cuò)但是沒(méi)有反應(yīng)。

比如我們?cè)趧?chuàng)建表時(shí)候可以使用check約束:

create table student(
	id int, name varchar(20), sex varchar(10), age int,
	check (age >= 18),
	check (sex = '男' or sex = '女')
	);

此時(shí)你插入的數(shù)據(jù)年齡小于18,或者性別不符合條件就會(huì)報(bào)錯(cuò)。

2. 數(shù)據(jù)庫(kù)設(shè)計(jì)

2.1 范式

范式是用來(lái)規(guī)范我們?cè)O(shè)計(jì)數(shù)據(jù)庫(kù)的規(guī)則,一共有六大范式,但是我們只需要使用三大范式就足以:第一范式,第二范式,第三范式。

2.2 第一范式

第一范式是說(shuō):

數(shù)據(jù)庫(kù)的每一列都是不可以在分割的原子數(shù)據(jù)項(xiàng)。

意思就是說(shuō)數(shù)據(jù)庫(kù)中的每一列的屬性都不能再劃分出來(lái)新的屬性,比如說(shuō):學(xué)校這個(gè)屬性就不能單獨(dú)作為一個(gè)屬性放在數(shù)據(jù)表中,因?yàn)閷W(xué)校這個(gè)還包含,學(xué)校地址,學(xué)校名稱,學(xué)校電話等屬性,此時(shí)我們應(yīng)該使用這些劃分出來(lái)的屬性作為表的屬性。

注意:在關(guān)系性數(shù)據(jù)庫(kù)中,每一列都使用基本數(shù)據(jù)類型就可以滿足第一范式了。

2.3 第二范式

第二范式是說(shuō):

在滿足第一范式的基礎(chǔ)上,還滿足數(shù)據(jù)庫(kù)中不能存在非關(guān)鍵字段對(duì)任意候選鍵部分函數(shù)依賴。

這里的主鍵可以包括一條屬性,也可以包括多條屬性。

  • 非關(guān)鍵字段:就是除了主鍵之外的其他屬性。
  • 候選鍵:主鍵包含的屬性。
  • 部分函數(shù)依賴:通過(guò)主鍵的一部分屬性就能確定一條元素。
  • 完全函數(shù)依賴:通過(guò)主鍵所有屬性才能確定一條元素。

第二范式就是要求數(shù)據(jù)庫(kù)中不能存在 表中的某一列屬性,通過(guò)主鍵的部分屬性就推出來(lái)了。

如果不滿足第二范式就可能導(dǎo)致數(shù)據(jù)冗余,或者插入,刪除,修改異常。

當(dāng)這張表主鍵只包含一列,就滿足第二范式。

2.4 第三范式

第三范式是說(shuō):

在滿足第二范式的基礎(chǔ)上,不存在非關(guān)鍵字段,對(duì)于候選鍵存在傳遞依賴。

意思就是說(shuō)數(shù)據(jù)表中不能存在 通過(guò)A屬性能確定B屬性,B屬性又可以確定C屬性,進(jìn)而A屬性能確定C屬性的傳遞依賴。也就是說(shuō)非主屬性之間不能存在依賴關(guān)系。

2.5 數(shù)據(jù)庫(kù)的設(shè)計(jì)過(guò)程

我們首先需要根據(jù)業(yè)務(wù)需求抽象出來(lái)具體的類:

  • 這里的類對(duì)應(yīng)數(shù)據(jù)庫(kù)設(shè)計(jì)中的實(shí)體,實(shí)體對(duì)應(yīng)的數(shù)據(jù)庫(kù)中的表。
  • 這里的類中的屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)設(shè)計(jì)中實(shí)體的屬性,實(shí)體的屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的列。
  • 接著找到實(shí)體與實(shí)體之間的關(guān)系,畫(huà)出E-R圖,
  • 最后根據(jù)E-R圖創(chuàng)建具體的數(shù)據(jù)庫(kù)。

3. 實(shí)體-關(guān)系圖

3.1 E-R圖的組成部分

  • 實(shí)體:相當(dāng)于現(xiàn)實(shí)中抽象出來(lái)的類,比如:學(xué)生和課程這就是兩個(gè)實(shí)體。
  • 屬性:類中的屬性,比如:學(xué)生id,學(xué)生姓名,課程id,課程名字等這些就是屬性。
  • 關(guān)系:兩個(gè)實(shí)體之間對(duì)應(yīng)什么關(guān)系,比如:學(xué)生選擇課程,這里的選擇就是兩個(gè)實(shí)體間的關(guān)系。

3.2實(shí)體與實(shí)體的關(guān)系

實(shí)體與實(shí)體的關(guān)系也就是表與表之間的關(guān)系,這里包含四種關(guān)系,一對(duì)一,一對(duì)多,多對(duì)多,沒(méi)關(guān)系。

3.2.1 一對(duì)一關(guān)系

這里的一對(duì)一關(guān)系是說(shuō)兩個(gè)實(shí)體之間是一個(gè)對(duì)應(yīng)一個(gè)的關(guān)系,比如說(shuō):人和身份證,這里一個(gè)人對(duì)應(yīng)一個(gè)身份證,而一張身份證對(duì)應(yīng)一個(gè)人。

一對(duì)一關(guān)系E-R圖

3.2.2 一對(duì)多關(guān)系

這里的一對(duì)多關(guān)系是兩個(gè)實(shí)體之間是一個(gè)對(duì)應(yīng)多的的關(guān)系,比如說(shuō),學(xué)生和班級(jí),這里的一個(gè)學(xué)生對(duì)應(yīng)一個(gè)班級(jí),一個(gè)班級(jí)可以有多個(gè)學(xué)生(高中)。

一對(duì)多關(guān)系E-R圖

3.2.3 多對(duì)多關(guān)系

這里的多對(duì)多關(guān)系是指兩個(gè)實(shí)體之間是多個(gè)對(duì)應(yīng)多個(gè),比如說(shuō),學(xué)生和課程,一個(gè)學(xué)生要學(xué)習(xí)習(xí)多門(mén)課程,一門(mén)課程有多個(gè)同學(xué)學(xué)習(xí)。

3.3 創(chuàng)建表

接下來(lái)我們就要根據(jù)E-R圖創(chuàng)建實(shí)體對(duì)應(yīng)的表。

3.3.1 一對(duì)一關(guān)系創(chuàng)建表

這里我用人和身份證兩個(gè)實(shí)體來(lái)創(chuàng)建表,這里我們可以通過(guò)在任意一個(gè)表中添加另外一個(gè)表中的關(guān)鍵屬性就能關(guān)聯(lián)兩張表。

  • 人(個(gè)人id,姓名,年齡,身高,體重)
  • 身份證(身份證號(hào),姓名,出生年月,家庭住址)

這里的兩個(gè)實(shí)體,可以寫(xiě)成:

  • 人(個(gè)人id,姓名,年齡,身高,體重,身份證id)
  • 身份證(身份證id,身份證號(hào),姓名,出生年月,家庭住址)

也可以寫(xiě)成:

  • 人(個(gè)人id,姓名,年齡,身高,體重)
  • 身份證(身份證id,身份證號(hào),姓名,出生年月,家庭住址,個(gè)人id)

下面代碼就實(shí)現(xiàn)了在身份證表中添加人的關(guān)鍵屬性:

create table people (
	id int primary key, 
	name varchar(20), 
	height double, 
	weight double
	);
insert into people values (1,'張三',170,60),(2,'李四',180,70);

create table card (card_id int primary key, card_num varchar(20), people_id int);
insert into card values (1,'123456',1), (2,'13579',2);

3.3.2 一對(duì)多關(guān)系創(chuàng)建表

這里我用學(xué)生和班級(jí)兩個(gè)實(shí)體來(lái)創(chuàng)建表,這里我們需要在學(xué)生這個(gè)實(shí)體中添加班級(jí)實(shí)體的關(guān)鍵屬性來(lái)關(guān)聯(lián)兩張表。

  • 學(xué)生(學(xué)生id,學(xué)生姓名,性別)
  • 班級(jí)(班級(jí)id,班級(jí)名稱)

我們應(yīng)該寫(xiě)成:

  • 學(xué)生(學(xué)生id,學(xué)生姓名,性別,班級(jí)id)
  • 班級(jí)(班級(jí)id,班級(jí)名稱)

下面代碼是在學(xué)生表中包含班級(jí)表的關(guān)鍵字段建立聯(lián)系,外鍵永遠(yuǎn)放在多的一方。

create table student(id int primary key, name varchar(20), gender varchar(20), class_id int);
insert into student values(1,'張三','男',1), (2,'李四','女',2);

create table class(class_id int, class_name varchar(20));
insert into class values(1, '一班'), (2,'二班');

3.3.3 多對(duì)多關(guān)系創(chuàng)建表

這里我們用學(xué)生和課程兩個(gè)實(shí)體來(lái)創(chuàng)建表,這里我們需要重新創(chuàng)建一張關(guān)系表來(lái)包含兩個(gè)實(shí)體的關(guān)鍵屬性來(lái)關(guān)聯(lián)兩張表。

  • 學(xué)生(學(xué)生id,學(xué)生姓名,性別)
  • 課程(課程id,課程名字)

我們應(yīng)該寫(xiě)成:

  • 學(xué)生(學(xué)生id,學(xué)生姓名,性別)
  • 課程(課程id,課程名字)
  • 選課表(學(xué)生id,課程id)

下面是創(chuàng)建的選課表將學(xué)生和課程兩個(gè)表關(guān)聯(lián)起來(lái)。

create table student(id int primary key, name varchar(20), gender varchar(20));
insert into student values(1,'張三','男'), (2,'李四','女');

create table course(course_id int primary key, course_name varchar(20));
insert into course values(1,'軟件工程'), (2,'高等數(shù)學(xué)'), (3,'線性代數(shù)');

create table chocourse(id int, s_id int, c_id int, foreign key (s_id) references student(id), foreign key (c_id) references course(course_id));
insert into chocourse values(1,1,1), (2,1,2), (3,2,2),(4,2,3);

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

安溪县| 罗田县| 丹寨县| 囊谦县| 太仓市| 观塘区| 勐海县| 万安县| 丘北县| 吉木萨尔县| 海安县| 清镇市| 吉木萨尔县| 资兴市| 瓮安县| 林州市| 苗栗市| 宁国市| 长乐市| 敦化市| 百色市| 莱西市| 封丘县| 河北区| 昌吉市| 钟山县| 五河县| 汉沽区| 双峰县| 榆树市| 雅江县| 霍邱县| 阿鲁科尔沁旗| 长兴县| 舒兰市| 遵义市| 文山县| 平和县| 渝中区| 廉江市| 民乐县|