PS5 九月系統更新今日到來,支援 M.2 SSD 儲存空間擴充
什麼是約束?
約束對應的英語單詞:constraint
在建立表的時候,可以給表中的欄位加上一些約束,來保證這個表中資料的完整性、有效性
約束的作用就是為了保證表中的資料有效
約束包括哪些?
非空約束:not null
唯一性約束:unique
主鍵約束:primary key(簡稱PK)
外來鍵約束:foreign key(簡稱FK)
檢查約束:check(mysql不支援,oracle支援)
非空約束 not null
非空約束not null 約束的欄位不能為null
create table t_vip( id int, name varchar(255) not null ); insert into t_vip(id,name) values(1,'張三'); insert into t_vip(id,name) values (2,'李四'); insert into t_vip(id,name) values (3); #報錯,設有not null 的欄位不能為空,必須插入資料
not null只有列級約束,沒有表級約束
唯一性約束:unique
唯一性約束unique約束的欄位不能重複,但是可以為null
drop table if exists t_vip; create table t_vip( id int, name varchar(255) unique, email varchar(255) ); insert into t_vip(id,name,email) values (1,'張三','[email protected]'); insert into t_vip(id,name,email) values (2,'李四','[email protected]'); insert into t_vip(id,name,email) values (3,'王五','[email protected]'); select * from t_vip; insert into t_vip(id,name,email) values (4,'王五','[email protected]'); #報錯,欄位有unique約束,具有唯一性,不能重複 insert into t_vip(id) values(5); insert into t_vip(id) values(6); #雖然被unique約束了,但是可以為null
兩個欄位聯合起來具有唯一性
drop table if exists t_vip; #約束新增在列的後面,這種約束被稱為列級約束 #約束沒有新增在列的後面,這種約束被稱為表級約束 create table t_vip( id int, name varchar(255), email varchar(255), unique(name,email) #兩個欄位聯合起來唯一 ); insert into t_vip(id,name,email) values (1,'zhangsan','[email protected]'); insert into t_vip(id,name,email) values (2,'zhangsan','[email protected]'); select * from t_vip; insert into t_vip(id,name,email) values (3,'zhangsan','[email protected]'); #報錯, Duplicate entry '[email protected]' for key 't_vip.name'
什麼時候使用表級約束?
需要給多個欄位聯合起來新增某一個約束的時候,需要使用表級約束
unique和notnull可以聯合使用
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) not null unique
);
insert into t_vip(id,name) values (1,'zhangsan');
insert into t_vip(id,name) values (2,'zhangsan'); #錯誤,unique約束
insert into t_vip(id) values (3); #錯誤,not null約束
在MySQL當中,如果一個欄位同時被not null 和 unique約束的話,該欄位會自動變成主鍵
主鍵約束(primary key,簡稱PK)
主鍵約束的相關術語:
- 主鍵約束:就是一種約束
- 主鍵欄位:該欄位上添加了主鍵約束,這樣的欄位叫做:主鍵欄位
- 主鍵值:主鍵欄位中的每一個值叫做:主鍵值
什麼是主鍵?有啥用?
主鍵值是每一個記錄的唯一標識
主鍵值是每一行記錄的身份證號
任何一張表都應該有主鍵,沒有主鍵,表無效
主鍵的特徵:not null + unique(主鍵值不能是null,同時也不能重複)
給一張表新增主鍵約束
drop table if exists t_vip;
create table t_vip(
#一個欄位做主鍵叫做:單一主鍵
id int primary key, #列級約束
name varchar(255)
);
insert into t_vip(id,name) values (1,'zhangsan');
insert into t_vip(id,name) values (2,'lisi');
#錯誤,主鍵不能重複
insert into t_vip(id,name) values (2,'wangwu');
select * from t_vip;
insert into t_vip(name) values ('zhaoliu'); #錯誤,主鍵不能為空
#主鍵可以使用表級約束
create table t_vip(
id int,
name varchar(255),
primary key(id) #表級約束
);
insert into t_vip(id,name) values (1,'zhangsan');
insert into t_vip(id,name) values (2,'lisi');
#錯誤:重複
insert into t_vip(id,name) values (2,'wangwu');
#表級約束主要是給多個欄位聯合起來新增約束
create table t_vip(
#id和name聯合起來做主鍵:複合主鍵
id int,
name varchar(255),
email varchar(255),
primary key(id,name)
);
insert into t_vip(id,name,email) values (1,'zhangsan','[email protected]');
insert into t_vip(id,name,email) values (1,'lisi','[email protected]');
select * from t_vip;
#錯誤:不能重複
insert into t_vip(id,name,emali) values (1,'zhangsan','[email protected]');
#錯誤: Multiple primary key defined 一張表,主鍵約束只能新增一個
create table t_vip(
id int primary key,
name varchar(255) primary key
);
主鍵值建議使用:
- int
- bigint
- char
- 等型別
不建議使用:varchar來做主鍵,主鍵值一般都是數字,一般都是定長的
主鍵:除了單一主鍵和複合主鍵之外,還可以這樣進行分類
- 自然主鍵:主鍵值是一個自然數,和業務沒關係
- 業務主鍵:主鍵值和業務緊密關聯,例如拿銀行卡賬號做主鍵值,這就是業務主鍵
實際開發中自然主鍵使用比較多,因為主鍵只要做到不重複就行,不需要有意義
業務主鍵不好,因為主鍵一旦與業務掛鉤,那麼當業務發生變動的時候,可能會影響
到主鍵值,所以業務主鍵不建議使用,儘量使用自然主鍵
#mysql中,有一種機制,可以幫助自動維護一個主鍵值
create table t_vip(
id int primary key auto_increment,
name varchar(255)
);
insert into t_vip(name) values ('張三');
insert into t_vip(name) values ('張三');
insert into t_vip(name) values ('張三');
insert into t_vip(name) values ('張三');
insert into t_vip(name) values ('張三');
insert into t_vip(name) values ('張三');
insert into t_vip(name) values ('張三');
select * from t_vip;
外來鍵約束(foreign key,簡稱FK)
外來鍵約束涉及到的相關術語:
- 外來鍵約束:一種約束(foreign key)
- 外來鍵欄位:該欄位上新增外來鍵約束
- 外來鍵值:外來鍵欄位當中的每一個值
子表和父表之間的順序
刪除表的順序
- 先刪子,再刪父
建立表的順序
- 先建立父,再建立子
刪除資料的順序
- 先刪子,再刪父
插入資料的順序
- 先插入父,再插入子
思考:子表中的外來鍵引用的父表中的某個欄位,被引用的這個欄位必須是主鍵嗎?
不一定是主鍵,但至少具有unique約束
設計一張資料庫表,來描述"班級和學生"資訊
drop table if exists t_student;
drop table if exists t_class;
#請設計一張資料庫表,來描述"班級和學生"的資訊
create table t_class(
classno int primary key,
classname varchar(255)
);
create table t_student(
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key(cno) references t_class(classno) #外來鍵約束
);
insert into t_class(classno,classname) values (110,'麻省理工軟體與資訊工程學院1班');
insert into t_class(classno,classname) values (111,'麻省理工軟體與資訊工程學院2班');
insert into t_student(name,cno) values ('Jack',110);
insert into t_student(name,cno) values ('Marry',110);
insert into t_student(name,cno) values ('Lucy',110);
insert into t_student(name,cno) values ('Cedric',110);
insert into t_student(name,cno) values ('zhangsan',110);
insert into t_student(name,cno) values ('lisi',111);
insert into t_student(name,cno) values ('wangwu',111);
insert into t_student(name,cno) values ('zhaoliu',111);
insert into t_student(name,cno) values ('Smith',111);
select * from t_class;
select * from t_student;
#外來鍵欄位可以為null
insert into t_student(name) values ('qiqi');