03 數據庫入門學習-完整性約束、關聯關系
一、完整性約束
1.什麽是約束
為了保證數據的合法性與完整性,對字段進行了除了數據類型以外添加額外的約束。
2.not null
2.1意義
not null是非空約束,數據不能為空
2.2語法
create table student (id int,name char(10) not null);#名字不能為空
3.default
3.1意義
default 默認值約束,可以指定字段的默認值
3.2語法
create table user (id int,name char(10) not null,sex char(5) default "woman");
#當在一個大多數的情況都為一個值的時候,就可以用默認約束
4.unique
4.1意義
unique 唯一性約束,該字段的值不能重復。比如,身份證,手機號,學號
unique其實是一種索引,索引是一種數據結構,用於提高查詢效率。
unique可以為空,一張表中可以有多個唯一約束
4.2語法
單列唯一約束
create table t5(idcard char(18) unique);
多列聯合唯一約束
create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber)); #意思: 身份證相同 並且 手機號相同 那就叫相同
5.primary key
5.1意義
primary key稱之為主鍵約束,用於唯一標識表中一條記錄。
如何能做到唯一標識?
該字段,只要是唯一的,並且不為空即可。也就是說,從約束的角度來看主鍵約束和非空加唯一約束沒有區別
那它們之間的區別是什麽?
唯一約束,是一種索引,必然存在硬盤上的某個文件中,是物理層面(實實在在存在的數據)
primary key,是一種邏輯意義上的數據(實際上不存在)
換句話說,主鍵就是由唯一約束和非空約束 組成的約束
有主鍵和沒有主鍵的區別?
1.無法區分兩個相同記錄,比如班級裏有兩個人名字相同
3.可以建立關聯關系
5.2語法
create table stu (stuid int primary key,name char(3)); #create table stu(stuid int unique not null,name char(3));
多列聯合主鍵:
create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber)); #註意復合主鍵必須同時建立或者同時刪除
6.auto_increment
6.1意義
auto_increment ,自動增長,通常搭配主鍵字段使用,可以自動為你的數據分配逐漸
如何分配的?
添加一條就自動加1 計數從1開始
6.2語法
create table t9(id int primary key auto_increment,name char(3));
如果主鍵是自動增長的,當你執行insert操作時要註意,插入的時候可以跳過這個字段或者插入的時候為null
修改自動增長的起始位置
alter table t9 auto_increment = 7;
7.foreign key
7.1意義
foreign key 專門用於為表和表之間建立物理關聯
現在有兩張表,員工表和部門表
1. 從員工出發 員工對於部門來說 時 多個員工對應一個部門
2. 從部門出發 一個部門對應多個員工
雖然有了關系,但是兩個表之間還是沒有任何物理聯系,插一個不存在的部門也沒問題。
所以就需要外鍵來是的員工表和部門表產生關聯。
添加外鍵約束時: 產生的限制
被關聯的表需要先被創建
部門數據(主表)應該先插入 員工數據(從表)後插入
在刪除部門數據前(主表)前 要保證該部門的員工數據都刪除了
在更新部門編號前 要先保證沒有員工關聯到這個部門
簡單的說 外鍵指的是 另一張的主鍵
外鍵加上以後 主表中的數據 刪除 和更新時 都受到限制
7.2語法
先創建部門表(主表)
create table dept(id int primary key auto_increment,name char(10),manager char(10));
在創建員工表(從表)
create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));
8.級聯操作
8.1意義
常用於外鍵,指的是就是主表與從表同步更新和刪除
8.2語法
create table class(id int primary key auto_increment,namechar(10)); create table student( id int primary key auto_increment, name char(10), c_id int, foreign key(c_id) references class(id) on update cascade#同步更新 on delete cascade#同步刪除 ); #對主表的id進行更新 #以及刪除某條主表記錄 來驗證效果
二、關聯關系
1.一對多或多對一
表:學校表和課程表 關系:一個學校有多個課程 1 創建學校表:有學校id,學校名稱,地址 create table school(id int primary key auto_increment, name char(10), address char(20) ); 2 創建課程表:有課程id,課程名稱,課程價格,課程周期,所屬學校 create table course(id int primary key auto_increment, name char(10), price int, period char(5), school_id int, foreign key(school_id) references school(id) on update cascade on delete cascade ); 3.創建學校 insert into school(name,address) values (‘oldboyBeijing‘,‘北京昌平‘), (‘oldboyShanghai‘,‘上海浦東‘) ; 4.創建課程 insert into course(name,price,period,school_id) values (‘Python全棧開發一期‘,20000,‘5個月‘,2), (‘Linux運維一期‘,200,‘2個月‘,2), (‘Python全棧開發20期‘,20000,‘5個月‘,1) ;
2.一對一
表:學生表和客戶表 關系:一個學生對應一個客戶 #一定是student來foreign key表customer,這樣就保證了: #1 學生一定是一個客戶, #2 客戶不一定是學生,但有可能成為一個學生 1.創建客戶表 create table customer( id int primary key auto_increment, name varchar(20) not null, qq varchar(10) not null, phone char(16) not null ); 2.創建學生表 create table student( id int primary key auto_increment, class_name varchar(20) not null, customer_id int unique, #該字段一定要是唯一的 foreign key(customer_id) references customer(id) #外鍵的字段一定要保證unique on delete cascade on update cascade ); 3.增加客戶 insert into customer(name,qq,phone) values (‘李飛機‘,‘31811231‘,13811341220), (‘王大炮‘,‘123123123‘,15213146809), (‘守榴彈‘,‘283818181‘,1867141331), (‘吳坦克‘,‘283818181‘,1851143312), (‘贏火箭‘,‘888818181‘,1861243314), (‘戰地雷‘,‘112312312‘,18811431230) ; 4.增加學生 insert into student(class_name,customer_id) values (‘脫產3班‘,3), (‘周末19期‘,4), (‘周末19期‘,5) ;
3.多對多
表:學生表和老師表 關系:一個學生上過多個老師的課,一個老師教過多個學生 1.創建老師表 create table teacher (id int primary key auto_increment,name char(10)); 2.創建學生表 create table student (id int primary key auto_increment,name char(10)); #為了避免重復無用的關系數據 關系表加上關聯的主鍵約束 3.創建關聯表 create table t_s (t_id int, s_id int, foreign key(t_id) references teacher(id), foreign key(s_id) references student(id), primary key(t_id,s_id) ); 4插入數據 insert into student value(null,"lxx"); insert into teacher value(null,"exx"); insert into t_s value(1,1);
03 數據庫入門學習-完整性約束、關聯關系