0. 前言

1. 實體完整性

  • 1.1 主鍵約束(primary key)
  • 1.2 唯一約束(unique)
  • 1.3 自動增長列(auto_increment)

2. 域完整性

  • 資料型別
  • 非空約束
  • 預設值約束

3. 引用完整性

4. 表間的對映關係

0. 前言

什麼是資料完整性:保證使用者輸入的資料能正確地儲存到資料庫中。

如何確保資料完整性:在建立表時給表中新增約束

完整性的分類:

  1. 實體完整性
  2. 完整性
  3. 引用完整性

1. 實體完整性

什麼是實體:表中的一行(一條記錄)代表一個實體(entity)。

實體完整性的作用:標識每一行資料不重複。

約束型別:

  1. 主鍵約束(primary key)
  2. 唯一約束(unique)
  3. 自動增長列(auto_increment)

每個表可以有多個 UNIQUE 約束,但只能有一個 PRIMARY KEY 約束

1.1 主鍵約束(primary key)

特點:資料唯一,且不能為 null。

-- 第一種新增方式
CREATE TABLE student_1(
     id int primary key,
     name varchar(50)
); -- 第二種新增方式:此種方式優勢在於可以建立聯合主鍵
CREATE TABLE student_2_1(
     id int,
     name varchar(50),
     primary key(id)
); CREATE TABLE student_2_2(
     classid int,
     stuid int,
     name varchar(50),
     primary key(classid,stuid)
); -- 第三種新增方式
CREATE TABLE student_3(
     id int,
     name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);

1.2 唯一約束(unique)

特點:資料不能重複。

CREATE TABLE student(
     id int primary key,
     name varchar(50) unique
);

1.3 自動增長列(auto_increment)

-- 給主鍵新增自動增長的數值,列只能是整數型別,且必須配合主鍵使用
CREATE TABLE student(
     Id int primary key auto_increment,
     Name varchar(50)
); INSERT INTO student(name) values('tom');

2. 域完整性

域代表當前單元格。

域完整性的作用:限制此單元格的資料正確,不對照此列的其它單元格比較。

域完整性的約束分類:

  1. 資料型別
  2. 非空約束(not null)
  3. 預設值約束(default)
  4. check 約束(mysql 不支援):check(sex='男' or sex='女')

資料型別

《MySQL 基礎、安裝、配置》

非空約束(not null)

CREATE TABLE student(
     Id int pirmary key,
     Name varchar(50) not null,
     Sex varchar(10)
); INSERT INTO student values(1, 'tom', null);

預設值約束(default)

CREATE TABLE student(
     Id int pirmary key,
     Name varchar(50) not null,
     Sex varchar(10) default '男'
); insert into student1 values(1, 'tom', '女');
insert into student1 values(2, 'jerry', default);
insert into student1 values(3, 'peter');

3. 引用完整性(外來鍵約束)

在設定外來鍵(FOREIGN KEY)約束的情況下,插入表 2 的外來鍵欄位值必需要求在表 1 的主鍵欄位值中能找到。

同時,假設要刪除表 1 的某個主鍵欄位值,那麼必須保證表 2 中的外來鍵欄位沒有該主鍵欄位的值,否則就沒法刪除。

-- 建立表1
CREATE TABLE student(
     sid int pirmary key,
     name varchar(50) not null,
     sex varchar(10) default '男'
); -- 建立表2
-- 第一種新增外來鍵方式
create table score(
  id int,
  score int,
  sid int , -- 外來鍵列的資料型別一定要與主表主鍵的型別一致
  CONSTRAINT fk_score_sid foreign key (sid) references student(id)
); -- 第二種新增外來鍵方式
ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);

4. 表間的對映關係

示例:

一對一

例如 t_person 表和 t_card 表,即人和身份證。這種情況需要找出主從關係,即誰是主表,誰是從表。人可以沒有身份證,但身份證必須要有人才行,所以 t_person 是主表,而 t_card 是從表。

設計從表可以有兩種方案:

  • 在 t_card 表中新增外來鍵列(相對 t_person 表),並且給外來鍵新增唯一約束;
  • 給 t_card 表的主鍵新增外來鍵約束(相對 t_person 表),即 t_card 表的主鍵也是外來鍵。

一對多(多對一)

最為常見的就是一對多。一對多和多對一,取決於哪個角度去看的,一般都是在多方的那張表建立外來鍵。

多對多

例如 t_stu 和 t_teacher 表,即一個學生可以有多個老師,而一個老師也可以有多個學生。這種情況通常需要建立中間表來處理多對多關係,例如可以再建立一張表 t_stu_tea 表,給出兩個外來鍵,一個是相對 t_stu 表的外來鍵,另一個是相對 t_teacher 表的外來鍵。