0. 前言
1. 實體完整性
- 1.1 主鍵約束(primary key)
- 1.2 唯一約束(unique)
- 1.3 自動增長列(auto_increment)
2. 域完整性
- 資料型別
- 非空約束
- 預設值約束
3. 引用完整性
4. 表間的對映關係
0. 前言
什麼是資料完整性:保證使用者輸入的資料能正確地儲存到資料庫中。
如何確保資料完整性:在建立表時給表中新增約束。
完整性的分類:
- 實體完整性
- 域完整性
- 引用完整性
1. 實體完整性
什麼是實體:表中的一行(一條記錄)代表一個實體(entity)。
實體完整性的作用:標識每一行資料不重複。
約束型別:
- 主鍵約束(primary key)
- 唯一約束(unique)
- 自動增長列(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. 域完整性
域代表當前單元格。
域完整性的作用:限制此單元格的資料正確,不對照此列的其它單元格比較。
域完整性的約束分類:
- 資料型別
- 非空約束(not null)
- 預設值約束(default)
- check 約束(mysql 不支援):check(sex='男' or sex='女')
資料型別
非空約束(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 表的外來鍵。