06.數據的完整性

一、數據的完整性

作用:保證用戶輸入的數據保存到數據庫中是正確的。
確保數據的完整性 = 在創建表時給表中添加約束
完整性的分類:

  • 實體完整性:
  • 域完整性:
  • 引用完整性:

二、實體完整性

實體:即表中的一行(一條記錄)代表一個實體(entity)
實體完整性的作用:標識每一行數據不重複。
約束類型: 主鍵約束(primary key) 唯一約束(unique) 自動增長列(auto_increment)

2.1、主鍵約束(primary key)

注:每個表中要有一個主鍵。
特點:數據唯一,且不能爲null
例:
第一種添加方式:

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

當沒有約束的情況下,實體可以是相同的。
這裏寫圖片描述
當有了約束,id這個字段的值只能唯一,就保證了數據的唯一
這裏寫圖片描述
第二種添加方式:此種方式優勢在於,可以創建聯合主鍵(兩者不能相同)

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

這裏寫圖片描述
第三種添加方式:

CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student ADD CONSTRAINT pk_stu_id PRIMARY KEY(id);-- Constraint是約束,pk_stu_id是約束名稱(任意名稱)

2.2、唯一約束(unique):

特點:數據不能重複。

CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);

這裏寫圖片描述

2.3、自動增長列(auto_increment)

sqlserver數據庫 (identity) oracle數據庫( sequence)

給主鍵添加自動增長的數值,列只能是整數類型

CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);

INSERT INTO student(name) values(‘tom’);
INSERT INTO student(name) values(‘jim’);

這裏寫圖片描述

三、域完整性

域完整性的作用:限制此單元格的數據正確,不對照此列的其它單元格比較
域代表當前單元格
域完整性約束:數據類型 非空約束(not null) 默認值約束(default)
check約束(mysql不支持)check(sex=’男’ or sex=’女’)

3.1、數據類型:(數值類型、日期類型、字符串類型)

3.2、非空約束:not null

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);

INSERT INTO student values(1,’tom’,null);

這裏寫圖片描述

3.3、默認值約束 default

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);

insert into student values(1,'tom','女');
insert into student(id,name) values(2,'jerry');
insert into student values(3,'jim',default);

這裏寫圖片描述

四、引用完整性(參照完整性)

外鍵約束:FOREIGN KEY
例:

CREATE TABLE student(
id int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);

references 參照

create table score(
    id int,
    score int,
    stuid int , -- 外鍵列的數據類型一定要與主鍵的類型一致
    CONSTRAINT fk_score_sid foreign key (stuid) references student(id)
);

這裏寫圖片描述

這裏寫圖片描述

第二種添加外鍵方式。

ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(stuid) REFERENCES stu(id);

五、表與表之間的關係

  • 一對一:例如t_person表和t_card表,即人和身份證。這種情況需要找出主從關係,即誰是主表,誰是從表。人可以沒有身份證,但身份證必須要有人才行,所以人是主表,而身份證是從表。設計從表可以有兩種方案:
    • 在t_card表中添加外鍵列(相對t_user表),並且給外鍵添加唯一約束;
    • 給t_card表的主鍵添加外鍵約束(相對t_user表),即t_card表的主鍵也是外鍵。

例:

CREATE TABLE qq (
    qqid INT PRIMARY KEY,
    PASSWORD VARCHAR(50)
);

CREATE TABLE qqdetail (
    qqid INT PRIMARY KEY,
    NAME VARCHAR(50),
    address VARCHAR(200)
);


ALTER TABLE qqdetail ADD CONSTRAINT fk_qq_qqdetail FOREIGN KEY(qqid) REFERENCES qq(qqid);

這裏寫圖片描述

一對一主鍵關聯:要求兩個表的主鍵必須完全一致,通過兩個表的主鍵建立關聯關係
  • 一對多(多對一):最爲常見的就是一對多!一對多和多對一,這是從哪個角度去看得出來的。t_user和t_section的關係,從t_user來看就是一對多,而從t_section的角度來看就是多對一!這種情況都是在多方創建外鍵!

例:

CREATE TABLE student(
    id int pirmary key,
    name varchar(50) not null,
    sex varchar(10) default ‘男’
);
create table score(
    id int,
    score int,
    stuid int , -- 外鍵列的數據類型一定要與主鍵的類型一致
    CONSTRAINT fk_score_sid foreign key (stuid) references student(id)
);

這裏寫圖片描述

這裏寫圖片描述
一對多/多對一關係簡記:“多”的要記住“一”的主鍵,即每門成績都要通過外鍵來記住學生表。

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

例:

CREATE TABLE teacher (
    tid INT PRIMARY KEY,
    tname VARCHAR(20)
);

CREATE TABLE student(
    sid INT PRIMARY KEY,
    sname VARCHAR(50)
);

CREATE TABLE tea_stu_rel(
    tid INT ,
    sid INT 
);

ALTER TABLE tea_stu_rel ADD CONSTRAINT fk_tid FOREIGN KEY(tid) REFERENCES teacher(tid);
ALTER TABLE tea_stu_rel ADD CONSTRAINT fk_sid FOREIGN KEY(sid) REFERENCES student(sid);

這裏寫圖片描述

數據庫中的多對多關聯關係一般需採用中間表的方式處理,將多對多轉化爲兩個一對多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章