數(shù)據(jù)的完整性
作用:保證用戶輸入的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中是正確的。
確保數(shù)據(jù)的完整性=在創(chuàng)建表時(shí)給表中添加約束
完整性的分類:
>實(shí)體完整性
>域完整性
>引用完整性
5.1 實(shí)體完整性
實(shí)體:即表中的一行(一條記錄)代表一個(gè)實(shí)體(entity)
實(shí)體完整性的作用:標(biāo)識(shí)每一行數(shù)據(jù)不重復(fù)。
約束類型:主鍵約束(primary key)唯一約束(unique)自動(dòng)增長(zhǎng)列(auto_increment)
主鍵約束(primary key)
特點(diǎn):數(shù)據(jù)唯一,且不能為null
例:
第一種添加方式:
CREATE TABLE
student(
Id int primary key,
Name varchar(50)
);
第一種添加方式:此種方式優(yōu)勢(shì)在于,可以創(chuàng)建聯(lián)合主鍵
CREATE TABLE
student(
id int,
Name varchar(50),
Primary key(id)
);
CREATE TABLE
student(
id int,
Name varchar(50),
Primary key(id,name)
);
第三種添加方式:
CREATE TABLE
student(
Id int,
Name varchar(50)
);
ALTER TABLE
student
ADDPRIMARY KEY (id);
.唯一約束(unique):
CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
自動(dòng)增長(zhǎng)列(auto_increment)
給主鍵添加自動(dòng)增長(zhǎng)的數(shù)值,列只能是整數(shù)類型,但是如果刪除之前增長(zhǎng)的序號(hào),后面再添加的時(shí)候序號(hào)不會(huì)重新開(kāi)始,而是會(huì)接著被刪除的那一列的序號(hào)
CREATE TABLE
student(
Id int primary key auto_increment,
Name varchar(50)
);
INSERT INTO
student(name) values(‘tom’);
5.2 域完整性
域完整性的作用:限制此單元格的數(shù)據(jù)正確,不對(duì)照此列的其它單元格比較
域代表當(dāng)前單元格
域完整性約束:數(shù)據(jù)類型非空約束(not
null)默認(rèn)值約束(default)
Check約束(mysql不支持)check();
數(shù)據(jù)類型:(數(shù)值類型、日期類型、字符串類型)
非空約束:not null
CREATE TABLE
student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);
INSERT INTO
student values(1,’tom’,null);
默認(rèn)值約束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);
5.3 引用完整性
要有外鍵必須先有主鍵,主鍵和外鍵的類型必須一致
外鍵約束:FOREIGN KEY
例:
CREATE TABLE
student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);
create table
score(
id int,
score int,
sid int , --外鍵列的數(shù)據(jù)類型一定要與主鍵的類型一致
CONSTRAINT fk_score_sid foreign key (sid)references student(id)
);
第二種添加外鍵方式。
ALTER TABLE
score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);
5.4 表與表之間的關(guān)系
l一對(duì)一:例如t_person表和t_card表,即人和身份證。這種情況需要找出主從關(guān)系,即誰(shuí)是主表,誰(shuí)是從表。人可以沒(méi)有身份證,但身份證必須要有人才行,所以人是主表,而身份證是從表。設(shè)計(jì)從表可以有兩種方案:
?在t_card表中添加外鍵列(相對(duì)t_user表),并且給外鍵添加唯一約束;
?給t_card表的主鍵添加外鍵約束(相對(duì)t_user表),即t_card表的主鍵也是外鍵。
l一對(duì)多(多對(duì)一):最為常見(jiàn)的就是一對(duì)多!一對(duì)多和多對(duì)一,這是從哪個(gè)角度去看得出來(lái)的。t_user和t_section的關(guān)系,從t_user來(lái)看就是一對(duì)多,而從t_section的角度來(lái)看就是多對(duì)一!這種情況都是在多方創(chuàng)建外鍵!
l多對(duì)多:例如t_stu和t_teacher表,即一個(gè)學(xué)生可以有多個(gè)老師,而一個(gè)老師也可以有多個(gè)學(xué)生。這種情況通常需要?jiǎng)?chuàng)建中間表來(lái)處理多對(duì)多關(guān)系。例如再創(chuàng)建一張表t_stu_tea表,給出兩個(gè)外鍵,一個(gè)相對(duì)t_stu表的外鍵,另一個(gè)相對(duì)t_teacher表的外鍵。