幾種基本的約束和外鍵(一對一 多對多 多對一)級聯關系


約束
什么是約束
除了數據類型以外額外添加的約束
為什么要使用約束
為了保證數據的合法性 完整性

分類:
not null 非空約束 數據不能為空
學生表的姓名字段
create table student (id ind,name char(10) not null);

default 默認值約束 可以指定字段的默認值
create table user (id ind,name char(10) not null,sex char(1) default "woman");
會計行業 女生多,性別字段可以默認為女 這樣可以加快存儲效率

unique 唯一性約束 該字段的值不能重復
身份證 手機號 學號
unique其實是一種索引
索引是一種數據結構 用於提高查詢效率

可以為空
一張表中可以有多個唯一約束

單列唯一約束
create table t5(idcard char(18) unique);
多列聯合唯一約束
create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber));
意思: 身份證相同 並且 手機號相同 那就叫相同

primary key ******
稱之為主鍵約束.用於唯一標識表中一條記錄
如何能做到唯一標識?
該字段 只要是惟一的 並且不為空 即可
也就是說 從約束的角度來看主鍵約束 和 非空 加 唯一約束 沒有區別

那它們之間的區別是什么?
唯一約束 是一種索引 必然存在硬盤上的某個文件中 是物理層面(實實在在存在的數據)
唯一約束是硬盤上的數據不能相同,是實實在在的數據唯一不能有相同的
primary key 是一種邏輯意義上的數據 (實際上不存在)
換句話說 主鍵 就是由 唯一約束 和非空約束 組成的約束
就像 一男一女 可以組成夫妻 但是夫妻只是一種稱呼 不實際存在

語法:
create table stu (stuid int primary key,name char(3));
create table t7(id int unique not null,name char(3));

有主鍵 和沒有主鍵的區別?
1.無法區分兩個相同記錄 比如班級里有兩個人名字相同
2.有主鍵則意味有這索引 效率更高
3.可以建立關聯關系

多列聯合主鍵:
create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));

要不要主鍵?
必須的 每個表都應該有主鍵 哪怕不用唯一標識 也應該考慮提升效率
主鍵的字段名 幾乎都叫id
同一個表中可以不可以有多個主鍵?
不可以 設置多個主鍵沒有任何意義
所以一般一張表一般只有一個主鍵
主鍵的類型需要設置為整型,當然別的也行!建議你別這么干!
所以主鍵一般就是第一列 ID 設置成主鍵,而且自增 類型為整型


練習
創建一個員工表 里面存儲 員工信息 員工編號 姓名 年齡 性別
create table employee (id int primary key,name char(10) not null,age int not null,sex char(10) default "man");
插入數據
INSERT INTO employee VALUES(1,"楊總",20),(2,"egon",49),(3,"wxx",28);
問題? 你很可能忘記上一次的id到第幾了 導致你要先查看一下
麻煩影響效率 所以有了auto_increment


auto_increment ******
中文 自動增長
作用 通常搭配主鍵字段使用 可以自動為你的數據分配逐漸
如何分配的?
添加一條就自動加1 計數從1開始

語法: ******
create table t9(id int primary key auto_increment,name char(3));

如果主鍵是自動增長 你可以跳過這個字段 也可以為它插入null 都可以

修改自動增長的起始位置 **
alter table t9 auto_increment = 7;

注意: 自動增長 只能用於整型


foreign key ******




mysql提供了 foreign key 專門用於為表和表之間 建立物理關聯

思考 表里存儲的是一條條的記錄
兩個表之間能產生的關系有哪些?
現有 A B兩張表
1.多對一
2.一對一
3.多對多

在查找表之間的關系時 要分別站在 不同表去思考
1. 從員工出發 員工對於部門來說 時 多個員工對應一個部門
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));


需求: 設計 學員表 和 班級表 五分鍾練習
兩個表多對一的關系 通過外鍵來進行關聯
外鍵加在誰身上? 加到從表上
create table class(id int primary key auto_increment,name char(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 同步刪除

實例:
create table class(id int primary key auto_increment,name char(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
);

insert into class value(null,"python3期");
insert into student value(null,"羅傲宇",1);

對主表的id進行更新
以及刪除某條主表記錄 來驗證效果



多對多關系的處理:
建立一個第三方表 專門存儲兩個表之間的關系
這個關系表 應該有兩個字段 分別關聯學生的id 和老師的id
為了保證 數據的合法性 完整性 給這兩個字段都添加外鍵約束
實例: 見圖2
create table teacher (id int primary key auto_increment,name char(10));
create table student (id int primary key auto_increment,name char(10));
create table t_s (t_id int,
s_id int,
foreign key(t_id) references teacher(id), ###創建了一個外鍵
foreign key(s_id) references student(id)
);

為了避免重復無用的關系數據 關系表加上關聯的主鍵約束
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)
);

insert into student value(null,"lxx");
insert into teacher value(null,"exx");
insert into t_s value(1,1);



免責聲明!

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



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