1. 程式人生 > 資訊 >老哥都說好:藍禾醫療外科口罩 0.15 元 / 片

老哥都說好:藍禾醫療外科口罩 0.15 元 / 片

什麼是約束?

約束對應的英語單詞: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');