MySQL創建表時的約束(Constraint)

什麼是約束?

在創建表的時候,可以給表的字段添加相應的約束,添加約束的目的是爲了保證表中數據的合法性,有效性,完整性。

常見的約束有那些?

非空約束(not null):約束的字段不能爲null
唯一約束(unique):約束的字段不能重複
主鍵約束(primary key):約束的字段既不能爲null,也不能重複(簡稱 PK)。
外鍵約束(foreign key):(簡稱FK)。
檢查約束(check):注意Oracle數據庫有check約束,但是mysql沒有, 目前mysql不支持該約束。

1:非空約束:not null

create table t_student(
id bigint,
name varchar(255) not null,
sex char(1) default 1,
classno varchar(255),
birth char(10)
);

2:唯一性約束(unique)

唯一約束脩飾的字段具有唯一性,不能重複,但是可以爲null。
案例:爲某一列添加唯一性約束。

create table t_student(
no bigint unique,		//列級約束
name varchar(255) not null,
sex char(1) default 1,
classno varchar(255),
birth char(10)
);

案例2:給兩個列或者多個列添加唯一性約束。
表示兩個列聯合起來是唯一的。

create table t_student(
no bigint,
name varchar(255) not null,
unique(no ,name)	//多個字段聯合起來添加1個約束【表級約束】
sex char(1) default 1,
classno varchar(255),
birth char(10)
);

3:主鍵約束(primary key)

怎麼給一張表添加主鍵約束?

create table t_student(
id bigint primary key,		//列級約束
name varchar(255) not null,
sex char(1) default 1,
classno varchar(255),
birth char(10)
);

主鍵特點:主鍵字段中的數據不能爲null,也不能重複。

主鍵相關的術語?

主鍵約束:primary key
主鍵字段:id字段添加primary key之後,id叫做主鍵字段。
主鍵值:id字段中的每一個值都是主鍵值。

主鍵有什麼用呢?

-表的設計三範式中有要求,第一範式就是要求任何一張表都應該有主鍵。
-主鍵的作用:主鍵值是這行記錄在這張表當中的唯一標識。(就像一個人的身份證號碼)

主鍵的分類?
-根據主鍵的字段數量來劃分:

單一主鍵(常用)

複合主鍵
(多個字段聯合起來添加一個主鍵)(複合主鍵不建議 使用,因爲複合主鍵違背三範式。)
-根據主鍵性質來劃分:

自然主鍵:
主鍵值最好就是一個和業務沒有任何關係的自然數。(推薦使用)

業務主鍵:
主鍵值和系統的業務掛鉤,例如:拿銀行卡的卡號作爲主鍵,拿着身份證號碼作爲主鍵。(不推薦使用)

注意:一張表的主鍵約束只能有一個。

使用表級約束定義主鍵:

create table t_student(
id bigint,		//表級約束
primary key(id)
name varchar(255) not null,
sex char(1) default 1,
classno varchar(255),
birth char(10)
);

mySql提供的主鍵值自增(auto_increment):

drop table if exists t_student1;
create table t_student(
id bigint primary key auto_increment,	//id字段自動維護一個自增的數字,從1開始,以1遞增
name varchar(255) not null,
sex char(1) default 1,
classno varchar(255),
birth char(10)
);

提示:Oracle當中也提供了一個自增機制,叫做:序列(sequence)對象

4:外鍵約束(foreign key)

關於外鍵約束的相關術語:
外鍵約束:foreign key
外鍵字段:添加有外鍵約束的字段。
外鍵值:外鍵字段中的每一個值。

-語法:
foreign key(classno) references t_class(cno)

案例:學生表和班級表進行外鍵約束

drop table if exists t_student1;
drop table if exists t_class;
create table t_class(
	cno int primary key,
	cname varchar(255)
);

create table t_student1(
	id int primary key auto_increment,
	name varchar(255) not null,
	sex char(1) default 1,
	classno int,
	foreign key(classno) references t_class(cno),
	birth char(10)
);
insert into t_class
	(cno,cname)
values
	(101,'x'),
	(102,'y');
insert into t_student1
	(name,sex,classno,birth)
values
	('a','2',101,'1998-09-10'),
	('b','1',102,'1998-10-10'),
	('c','2',101,'1998-09-10');
select * from t_student1;
select * from t_class;

*外鍵值是否可以爲null?

外鍵可以爲null

*外鍵字段引用其他表的某個字段的時候,被引用的字段必須是主鍵嗎?

被引用的字段不一定是主鍵,但至少具有unique約束。

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