?MySQL(三)數據庫約束
數據庫約束
一、not null
二、default
三、unique
四、primary key
1.自增主鍵機制
1.1單服務器下
1.2分布式下
1.2.1時間戳
1.2.2主機編號
1.2.3隨機因子
五、foreign key
1.∈關系維護
1.1父約子:
1.2子約父:
1.3刪表:
2.邏輯刪除
2.1子表存父表刪
2.2電腦空間占用
數據庫約束
列字段對行記錄的數據的約束
一、not null
create table student(id int not null);
not null 約束此列字段的行數據 不能為空
二、default
create table student(name varchar(20) default 'unknow');
約束此列字段的行數據 在默認時的值是什么
每個列字段 默認都會有的default值 是null?
三、unique
create table student(id int unique);
約束此列字段的行數據 之間不能重復 是唯一的
唯一性字段unique、primary key的?每次新入行數據時 都會去遍歷查詢 是否會重復:
—>唯一性列字段創建時 會自動生成有索引,每次在此列字段?新入行數據時 都會用索引 精確定位到此列地 遍歷檢查行數據 是否會重復
四、primary key
create table student(id int primary key auto_increment);
約束 此列字段的行數據 或多個列字段的合行數據(聯合主鍵) 非空且唯一,相當于是not null與unique兩約束的合體版
作為記錄的身份標識字段,一張表中 只能有一個主鍵,每次新入主鍵的行數據時 會觸發 唯一性字段的 索引遍歷查詢重復
1.自增主鍵機制
每個記錄的主鍵值 都由數據庫服務器 自動機動分配設置
1.1單服務器下
單個mysql服務器里,主鍵可設置 自增主鍵機制auto_increment,服務器會維護著 當前主鍵值的最大值,每次分配時 以當前的最大值+1 來自增唯一id分配
1.2分布式下
分布式下的 多個mysql服務器中,如果用每個mysql服務器 各自維護的 當前最大值 來分配的話,主鍵值會重復 不行的,分布式用 唯一id = 時間戳 + 主機編號 + 隨機因子 來自增唯一id分配:
1.2.1時間戳
分布式下 用記錄產生時的時間戳 作為id,如果單位時間內 產生的記錄很多,可以把時間戳 往小設置 設置成毫秒級 微秒級的,盡量使得單位時間戳內 只有一條記錄的產生 而去分配
1.2.2主機編號
如果發現單位時間戳內 同時產生有多條記錄時,就將時間戳id 再拼上 記錄產生所處的 mysql服務器的主機編號,一般情況下,當設置的時間戳單位 小到一臺機器 一時間戳內 無法連續完成產生記錄時,此時的多條記錄 肯定是由不同主機同一時刻產生的,加上各自的主機編號后 就能確保id是唯一的了
1.2.3隨機因子
如果設置的時間戳不夠小,發現同一時間戳內產生的記錄 是由同一臺服務器主機產生時的,此時再在 同臺機器同時間戳的記錄 的id后面 再拼上隨機因子數 使得id不同
五、foreign key
create table class(classId int primary key,name varchar(20));
create table student(id int primary key,classId int,name varchar(20),foreign key(classId) references class(classId));
約束此列字段的行數據 來源包含于 外表的唯一性列字段行數據
1.∈關系維護
外鍵維護著 子表數據∈父表數據 的關系:
1.1父約子:
子表新入 此外鍵列字段行數據時,必須來源于 父表此列字段的行數據
1.2子約父:
父表更改 外鍵關聯的 此列字段行數據時,必須確保 子表此列字段里沒有包含它
1.3刪表:
刪除表時,只能 先刪子表再刪父表
2.邏輯刪除
2.1子表存父表刪
很多時候,父表需要刪除 但子表不能刪除,就可以通過在邏輯上 把父表狀態設置為刪除 來實現 父表刪,子表存 的效果,而實際上父表還在硬盤中 未刪除,等到后面子表 可以需要刪除時,再真正地將 子表與父表都刪去,實現靈活刪除的效果
2.2電腦空間占用
電腦硬盤上:
- 文件空間的占用時 將此存儲空間 邏輯上設置為已占用 并往里存儲它,別的文件就不能往這塊空間存了
- 刪除文件時 將此存儲空間 邏輯上設置為可占用 但并沒有把里面的數據清理,允許文件覆蓋占用地 繼續存儲著的