一、數據的完整性
作用:保證用戶輸入的數據保存到數據庫中是正確的。
確保數據的完整性 = 在創建表時給表中添加約束
完整性的分類:
- 實體完整性:
- 域完整性:
- 引用完整性:
二、實體完整性
實體:即表中的一行(一條記錄)代表一個實體(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);
數據庫中的多對多關聯關係一般需採用中間表的方式處理,將多對多轉化爲兩個一對多。