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

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

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

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

1.1 定義

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

1.2 約束類型

1.3 非空約束(not null)

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

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

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

1.4 默認約束(default)

default 是指定一個列的屬性,插入時候沒有定義具體的值,此時就使用定義的默認值。z

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

這里我們在age屬性后面加上默認值18,這樣我們在插入一條數(shù)據(jù)時候,沒有插入age的數(shù)據(jù),就填默認值18。

1.5 唯一約束(unique)

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

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

這里我們定義sno(學號)列的屬性是唯一的。

1.6 主鍵約束(primary key)

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

一般一些具有身份表示的屬性定義為主鍵,比如說老師的id,這里就可以id作為每個老師的身份標識。

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

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

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來定義的,針對一些整數(shù)類型的列可以自己增加大小,每次+1,每次都是在該列中最大的值的基礎上+1的。

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

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

下面列舉一種唯一主鍵的設定:

設置一個字符串id 表示唯一主鍵,字符串由 時間戳,機器編號,隨機因子等組成字符串,然后再求出一個哈希值,就可以得到一個唯一主鍵了。

1.7 外鍵約束(foreign key)

外鍵約束使用的是foreign key關鍵字,表示兩個表之間的約束關系。

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

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,'三班');

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

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 (學生表的外鍵) references 班級表表名 班級表的主鍵;

此時的班級表約束學生表,也就是說學生表依賴(聽)班級表的。

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

此時班級表在進行刪除和修改操作的時候,需要注意該操作是否合法,會先查詢下學生表是否有使用了班級表這行要刪除或者需修改操作的行

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

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

此時有一個問題:

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

因為此時訂單表中使用著當前的商品id,所以當前的該商品不能從商品表中直接刪除,那我們可以邏輯刪除,我們可以在商品表中加一列,boolean類型來判斷該商品是否被下架,而訂單表在創(chuàng)建新的訂單時候where下是否這個列的屬性是否表示未下架。

1.8 check約束

check約束只支持sql8版本,sql5.7不支持,sql5.7 在使用check約束時候,不會報錯但是沒有反應。

比如我們在創(chuàng)建表時候可以使用check約束:

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

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

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

2.1 范式

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

2.2 第一范式

第一范式是說:

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

意思就是說數(shù)據(jù)庫中的每一列的屬性都不能再劃分出來新的屬性,比如說:學校這個屬性就不能單獨作為一個屬性放在數(shù)據(jù)表中,因為學校這個還包含,學校地址,學校名稱,學校電話等屬性,此時我們應該使用這些劃分出來的屬性作為表的屬性。

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

2.3 第二范式

第二范式是說:

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

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

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

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

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

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

2.4 第三范式

第三范式是說:

在滿足第二范式的基礎上,不存在非關鍵字段,對于候選鍵存在傳遞依賴。

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

2.5 數(shù)據(jù)庫的設計過程

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

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

3. 實體-關系圖

3.1 E-R圖的組成部分

  • 實體:相當于現(xiàn)實中抽象出來的類,比如:學生和課程這就是兩個實體。
  • 屬性:類中的屬性,比如:學生id,學生姓名,課程id,課程名字等這些就是屬性。
  • 關系:兩個實體之間對應什么關系,比如:學生選擇課程,這里的選擇就是兩個實體間的關系。

3.2實體與實體的關系

實體與實體的關系也就是表與表之間的關系,這里包含四種關系,一對一,一對多,多對多,沒關系。

3.2.1 一對一關系

這里的一對一關系是說兩個實體之間是一個對應一個的關系,比如說:人和身份證,這里一個人對應一個身份證,而一張身份證對應一個人。

一對一關系E-R圖

3.2.2 一對多關系

這里的一對多關系是兩個實體之間是一個對應多的的關系,比如說,學生和班級,這里的一個學生對應一個班級,一個班級可以有多個學生(高中)。

一對多關系E-R圖

3.2.3 多對多關系

這里的多對多關系是指兩個實體之間是多個對應多個,比如說,學生和課程,一個學生要學習習多門課程,一門課程有多個同學學習。

3.3 創(chuàng)建表

接下來我們就要根據(jù)E-R圖創(chuàng)建實體對應的表。

3.3.1 一對一關系創(chuàng)建表

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

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

這里的兩個實體,可以寫成:

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

也可以寫成:

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

下面代碼就實現(xià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 一對多關系創(chuàng)建表

這里我用學生和班級兩個實體來創(chuàng)建表,這里我們需要在學生這個實體中添加班級實體的關鍵屬性來關聯(lián)兩張表。

  • 學生(學生id,學生姓名,性別)
  • 班級(班級id,班級名稱)

我們應該寫成:

  • 學生(學生id,學生姓名,性別,班級id)
  • 班級(班級id,班級名稱)

下面代碼是在學生表中包含班級表的關鍵字段建立聯(liá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 多對多關系創(chuàng)建表

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

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

我們應該寫成:

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

下面是創(chuàng)建的選課表將學生和課程兩個表關聯(lián)起來。

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ù)學'), (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é)

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

相關文章

最新評論

陈巴尔虎旗| 龙门县| 芒康县| 油尖旺区| 武胜县| 西平县| 会东县| 化德县| 雅江县| 太仆寺旗| 聊城市| 宣恩县| 抚顺县| 资阳市| 孝义市| 玛曲县| 苏尼特右旗| 德惠市| 湟源县| 孟村| 毕节市| 建德市| 英德市| 泸溪县| 普兰店市| 汪清县| 专栏| 宜州市| 泊头市| 丰原市| 无棣县| 长顺县| 龙胜| 古田县| 长泰县| 楚雄市| 红原县| 应用必备| 济南市| 全南县| 荆门市|