mysql 中的約束------表與表之間的關系


約束

mysql中的約束

unique:

​ 唯一性的約束,表示這個字段不能出現重復的值,用於唯一標識一條記錄

​ e.g.:身份證,學號

not null:

​ 非空約束,表示這個字段的值不能為空

​ e.g.:賬戶名,密碼

null:

​ 一些數據類型默認就是可以為空的

default:

​ 默認值,用於給某一個字段設置默認值

普通約束

#完整的建表語句
create table table_name(字段名稱  字段類型【(寬度)約束】charset utf8;
#學生表
create table student(
	#非空
	name char(10) not null,
	#默認值
	gender enum('g','b') default 'b')
	#唯一
    id int unique)
    
#測試
insert into student values(null,null,null)#錯誤  原因是name不能為空
insert into student values('jack',null,null)#可以插入,原因是null作為一個特殊的值,並且id的唯一約束也可以為null
insert into student (name,id)values('jack',null);#可以插入 當沒有給gender指定參數時,可以用默認值
alter table student modify id int unique not null
#為已經存在的字段添加約束

primary key:

​ 主鍵約束,從約束角度老看就等同於 非空+唯一

​ 主鍵和普通約束的區別在於:

create table person(
	id char(19) primary key,
	name char(20)
);
insert into person values('1','rose');#ok
insert into person values('1','jack')# ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'主鍵沖突;
insert into person values('2','jack')#ok
insert into person values(null,'tomor')
#Column 'id' cannot be null #主鍵不能為空


#從約束角度來看,等同於,非空+唯一
#create table person(
	id char(10),
    name char(20)
    );
#在innodb存儲引擎中,主鍵用於組織數據(樹形結構)
#也就是說主鍵對於innodb引擎來說是必要的,沒有不行
#如果沒有手動指定主鍵
#mysql 會自動查找一個具備非空且唯一的字段作為主鍵
#如果沒有這樣的字段,mysql會創建一個隱藏字段 作為主鍵
#首先明確主鍵是一個索引,unique也是,索引的作用是加速查詢
#如果我們在查詢語句中沒有使用索引字段,mysql講無法為我們查詢加速,一位置如果沒有主鍵,將無法加速查詢


總的來說:主鍵具備約束的作用,還能加快我們的查詢速度,所以今后在創建表的時候都應該創建索引字段
將什么樣字段創建主鍵:
	#如果本來的業務就存在非空且唯一的字段,那就把他設為主鍵
    #如果沒有那就自己添加一個字段專門作為主鍵
    
通常我們將主鍵設置為類 int 類型  為了方便保證唯一
案例:
mysql>create table Pc(
	id in primary key,
	pinpai char(20),
	model char(10),
	price float
);
mysql> insert into PC values(1,"IBM","1214SB",40000);
mysql> insert into PC values(2,"DELL","1200DSB",4000);
mysql> select *from PC;
mysql> select *from PC where id = 1;
mysql> select *from PC where pp = "DELL";

為主鍵設置自動增長:

​ mysql有一個自動增長的屬性,可以添加在整形字段上,每次插入數據時,都可以自動的插入值,並且每次加1不會沖突;

create table teacher(
	id int primary key auto_increment,
	name char(10)
);
insert into teacher values(null,'jack');
#對於自定增長的字段可以給null,會自動生成值
insert into teacher(name) values('jack');
#可以跳過這個字段

自動增長可以用在具備索引,並且是數字類型的字段上,但是通常與主鍵一起使用

表yu表之間的關系:

foregin key:外鍵約束,用於指向另一個表的主鍵字段

#創建標的時候添加外鍵
create table teacher (
	id int primary key auto_increment,
	name char(10),
	gender char(1),
	dept_id int,
	foreign key (dept_id) references dept(id)
);
#注解
foregin key (dept_id) references dept(id)
#其中dept_id 表示表的外鍵字段
#dept 表示要關聯哪個表
#dept(id)  id 表示的是關聯的dept表的id字段

先后循序
先有主表,,再有從表
先有dept ,,再有teacher

foreign key 帶來的約束作用

1.先從表中插入一條記錄,關聯了一個主表不存在的id  會導致插入失敗
必須保證部門id(外鍵的值)必須是在主表中存在的
2.插入數據的順序:
	先主表 再插入從表
3.從表更新外鍵時也必須保證 外鍵的值在主表中是存在的
4.刪除主表記錄前,要保證從表中沒有外鍵關聯被刪除的id
	-必須先刪除從表再刪除主表
5.更新主表記錄的主鍵時,要保證從表中沒有外鍵關聯被刪除的id
6.必須先創建主表
7.刪除表  其必先刪從表

foreign key 就是用來保證兩張表之間的關聯是正確的

練習:班級表和學員表

主:班級 從:學員

create table class(
	id int primary key auto_increment,
	name char(20),
);
create table student(
	id int primary key auto_increment,
	name char(20),
	gender char(1),
	c_id int,
	foreign key (c_id) references class(id)
);

級聯操作 cascade

當我們需要刪除主表信息時,必須先刪除從表中的關聯數據,很麻煩

那級聯操作可以幫助解決--->也就是說當你操作主表時,自動的操作從表

兩種操作:

1《 級聯的刪除

​ 當刪除主表時自動刪除從表中相關數據

2《級聯的更新

​ 當主表的主鍵更新時,會自動的更新關聯從表的數據

案例:

create table if exists class;
#如果這個表存在,創建新的表會產生重名的話,可以避免報錯,if exists
# if not exists 如果不存在才執行
create table claaa(
	id int primary key auto_increment,
	name char(20),
);
insert into class values (null,'py9');
insert into class values(null,'py10');

#創建表的時候指定級聯操作
drop table if exists student;
create table stydent(
	id int primary key auto_increment,
	name char(20),
	gender char(1),
	c_id int,
	foreign key (c_id) references class(id)
    on update cascade
    on delete cascade
);
#級聯操作可以單獨使用 也可以一起使用,空格隔開即可
insert into student values(null,"jack","m",1);
insert into student values(null,"rose","m",1);
insert into student values(null,"tom","m",2);

外鍵的使用:

​ 什么時候時候外鍵:---------表之間存在關聯關系

首先確定表之間的關系

1:多對一 (一對多)

案例:部門==老師

	#部門:
	create table dept(
        id int primary key auto_increment,
        name char(20),
        job char(50),
        manager char(10)
	);
	#老師表:
	create table teacher(
        id int primary key auto_increment,
        name char(20),
        gender char(1),
        dept_id int,
        foreign key(t_id) references teacher(id),
	);

2:多對多

需要建立一個中間表

學生 老師共同的id

處理方式:

​ 建立一個中間表,用於存儲關系,至少具備兩個字段分別指向學生和老師的主鍵,兩個字段都是外鍵 如下:

create table t_s_r (
id int primary key auto_increment,
t_id int,
s_id int,
foreign key (t_id) references teacher (id),
foreign key (s_id) references student(id),
unique key (t_id,s_id)
);
#問題是  上表的id是可選的,如何保證沒有重復關系

1:
#給兩個字段設置聯合唯一+非空
alter table t_s_r add unique key(t_id,s_id);
2:創建表時指定  多字段聯合唯一
alter table t_s_r(t_id int ,s_id int,unique key(t_id,s_id));


#推薦 將中間的關系表  兩個id作為聯合主鍵同時具備了唯一且非空約束
create table t_s_r (t_id, int s_id int,primary key(t_id,s_id));


處理多對多關系
1創建兩個主表  如學員  和 老師
2創建關系表  包含兩個字段  分別設置外鍵 指向對應的表
3將兩個字段 作為聯合主鍵

案列:

create table student(id int primary key auto_increment,name char(10));
create table teacher(id int primary key auto_increment,name char(10)); 
create table t_s_r(
    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)
    );
 # 先插入 學生或是老師都可以 但是關系表一定是最后添加的 
 insert into teacher values(null,"bgon"),(null,"nike");
 
  insert into student values(null,"老王"),(null,"老李");
  
  # 老王被bgon教過 
  insert into t_s_r values(1,1);
   # nike教過老李 
  insert into t_s_r values(2,2);
   # nike教過老王 
  insert into t_s_r values(2,1);



 已知老師名稱為bgon 請找出他教過那些學生			
1.通過名字獲取 bgon的id 			
2.拿着id取關系表中拿到一堆學生的id			
3.通過學生的id取出學生的信息			
 select id from teacher where name = "bgon";
 select s_id from t_s_r where t_id = 1;
 select  * from student where id = 1;
 
 # 子查詢方式   把一條語句的結果作為另一條語句的條件!
 select  * from student where id = (select s_id from t_s_r where t_id = (select id from teacher where name = "bgon"));
  
  
  
 已知學生名為老李 請查詢出 哪些老師教過他  				
1.通過名字獲取老李的id
select id from student where name = "老李";
2.拿着id去關系表 找出老師的id				
select t_id from t_s_r where s_id = 2;
3.通過老師的id取出老師的信息 			
select name from teacher where id = x;


# 子查詢方式:
select name from teacher where id = (
    select t_id from t_s_r where s_id = (
        select id from student where name = "老李"
    )
);

3:一對一

處理順序:

將先存在的數據作為主表

后存在的作為從表

使兩個表的id保持一致 ---對應起來

​ 方法1:從表的id 即是主鍵 又是外鍵

​ 2:從表的id設置為外鍵 並保證唯一

案列:

#人員表
create table person(
	id int primary key auto_increment,
	name char(10),
	age int
);
#詳情表
create table person_info(
	id int primary key,
	heigent float,
	weight float,
	foreign key(id) references person(id)
);
#在這樣的關系中,必須先插入主表即person,拿到id之后在添加詳情表額數據
#將一條完整數拆分到不同的表中,可以提高查詢的效率,上述方法稱之為垂直分表

!@#¥%……***

約束:精華

unique 唯一
not null 非空
null 可以為空
default 默認值
primary key --->主鍵==(非空+唯一)加速查詢
auto_increment  自動增長‘
foreign key   外鍵約束,保證兩張表的關系是完整的
級聯操作 :用在外鍵關聯中,可以級聯的刪除或更新從表記錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM