創建表時的約束
什麼是約束?
在創建表的時候,可以給表的字段添加相應的約束,添加約束的目的是爲了保證表中數據的合法性,有效性,完整性。
常見的約束有那些?
非空約束(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約束。