Linux資料庫管理——day2——基本約束、主外來鍵
使用時間函式獲得函式
now() | 獲得當前時間的日期 | 對應datatime型別 |
year(字串) | 獲得後面字串中指定的年 | 對應year型別 |
month(字串) | 獲得後面字串中指定的月 | |
date(字串) | 獲得後面字串中指定的日 | 對於date型別 |
time(字串) | 獲得後面字串中指定的時間 | 對於time型別 |
sleep(數字) | 命令休眠多少秒後執行 | |
curdate() | 單獨獲取當前日期 | 對於他date型別 |
curtime() | 單獨或等當前系統的時刻 | 對於time型別 |
在沒有對timestamp型別資料賦值的時候,會自動拿系統當前時間進行賦值
而沒有datetime型別賦值的時候,會自動賦空值null
約束(在建立表的時候,寫在表型別後面,空格隔開,可以有多個約束,約束間也是用空格分隔)
null | 設定該列能否空(就是什麼都沒有,用null標示) | 預設允許賦null值 | |
賦值方法 | 直接在建立表的型別後面空格寫上 可以寫no null或者null或者不寫 | ||
如果寫not null,代表允許賦null值 | |||
如果什麼寫代表null,代表不允許賦null值 | |||
key | 鍵值型別 | 普通索引(index) | desc查詢的KEY標誌:MUL |
唯一索引(unique) | |||
全文索引(fulltext) | |||
主鍵(primary key) | desc查詢的KEY標誌:PRI | ||
外來鍵(foreign key) | |||
Default 預設值 | 當不被欄位賦值時,使用預設值給欄位賦值 | ||
不設定預設值時候 | 系統定義的是null | ||
賦值方法 | default (值,也可以是,用逗號隔開多個值) | ||
Extra | 額外設定 | 欄位是否設定為自動增加,預設沒有自動增長功能 |
注:
1. 如果出現null,其在表中作為值代表空,而"null"代表這四個字母
2. 不管是什麼情況,只要值的型別是字串,就必須用引號引起來,一個值放在一個引號下,多個值用多個引號,然後之間用逗號隔開
3. 在決定能不能輸入相同值或者空值的時候是所有約束資訊共同作用,一個不允許就某個做法不成立
4. 如果檢視的時候橫著看不方便可以在後面加 \G 讓輸出豎著排列,一行資料一個模組,一個模組中有相應的每個欄位資料
修改表結構
alter table 庫.表 執行動作
執行動作:
新增新欄位:
add 欄位名 型別(寬度) [ 約束條件] [after 已有欄位 | first]
# 給表新建一個欄位,如果要約束就寫,沒有就不寫
# 如果要選定欄位位置,就用 after+放在哪個欄位後面 ,如果想放在最前面就用 first 。
修改某個欄位:
modify 欄位名 型別(寬度) [ 約束條件] [after 已有欄位 | first]
# 如果有不想修改的資訊,必須原樣抄過來,不然會變成預設值
# 修改時不能與已經儲存的資料矛盾的話不允許修改
# 調整位置,就是把型別約束原樣寫下,然後寫 after+想換到的位置
調整欄位名:
change 原欄位名 新欄位名
刪除已有欄位:
drop 欄位名
# 可是資料也會被刪了,所以要慎重
# 可以刪多行 --> alter table 庫.表 drop 欄位, drop欄位
注: 上面寫的都是執行動作,前面都要加上 ' alter table 庫.表 ' 這樣命令才完整
修改表名:
alter table 源表名 rename [to] 新表名;
鍵值:
作用: 限制賦值、給欄位值排隊
普通索引(INDEX):
KEY標誌: MUL
作用: 對記錄集的多個欄位進行排序,沒有限制賦值的作用
型別包括: Btree、B+tree、bash
預設演算法: Btree(二叉樹演算法),演算法邏輯就是用二分法把資料進行分組形成樹,樹的中序編歷值是從小到大排列的,葉子就是具體值;其最大缺點就是修改表的速度會降低,然後儲存空間也會變大;最大的優點就是查詢速度塊,因為查詢效率優先順序高於儲存效率,所以所以應用廣泛
注意:
1. 一個可以有多個索引欄位;
2. 索引的欄位內的值允許重複、為空
3. 索引只有使用者進行篩選資料的時候在發揮作用,
意思就是 select * from 表 的時候順序是儲存的順序,
只有 select * from 表 where 條件 的時候索引的排序才發揮作用
檢視:
# 看第四列key列 是MUL代表普通索引
desc 表名;
# 檢視詳細資訊
show index from 表名\G;
# 檢視某個select語句也沒有使用索引,如果顯示行數小於總行數,或者EXTRA是using,代表用了索引
explain select ……(命令內容)
建立
# 在已有表建立(一般索引名和欄位名設一樣)
create index 索引名 on 表名(欄位名);
# 建表是時建立
create table 表名(
欄位1的具體資訊配置,
……
欄位n的具體資訊配置,
index(欄位名1),……,index(欄位名n)
);
刪除(用show命令查索引名字,一般和欄位重名)
drop index 索引名 on 表名;
主鍵(primary key):
KEY標誌: PRI
特點:主鍵是表中唯一能標識記錄的欄位,一個表中只能有一個primary key欄位,不允許重複和賦空值。
注意:
0. 主鍵,一定是唯一且非空的!!
當是複合主鍵的時候,只要主鍵中的多個欄位不同時完全相同即可,也就是說只要複合主鍵中多個欄位中的一個欄位不同即可建立成功
但是不管是不是複合主鍵,任何情況,作為主鍵中的任意一個欄位都不能為空
1. 一個primary key欄位可以由一個表字段,也可以由多個表字段組成,如果由多個欄位組成,則稱之為複合主鍵,不過必須一起建立。但是建立複合主鍵,不能直接在欄位後面加上primary key ,而只能在全部欄位建立後一起定義
2. 通常把表中唯一標示的欄位作為主鍵欄位,通常設編號為主鍵
3. 通常和AUTO_INCREMENT連用,這樣可以讓主鍵在有新資料的時候,自動加1進行填充,這樣就算填寫資料的時候沒有寫,也不會報錯,當然也可以手動賦值(必須符合所有的約束條件)。
如果主鍵是數字,那麼每次建立資料的時候如果沒有定義主鍵值,那麼自己生成的 主鍵序號=歷史最大主鍵序號+1 ,
例子:假如現在資料庫設定了主鍵是int,然後已經建立了5行資料主鍵分別是1、2、3、4、5
如果這時候建立一行資料沒有定義主鍵,主鍵就是6。
如果這時候刪除最後一行(主鍵為5那行),再建立一行資料,新一行主鍵預設還是6。
如果這時候新加一行定義主鍵為10,然後再建立一行資料,新一行主鍵預設為11。
建立
# 在已有表建立(如果寫一個欄位就是普通主鍵,寫多個欄位就是複合主鍵)
alter table 表名 add primary key(欄位1,……,欄位n);
# 建表是時建立
create table 表名(
欄位1的具體資訊配置,
……
欄位n的具體資訊配置,
primary key(欄位名1,……,欄位名n)
);
# 也可以這麼寫,當然主鍵欄位不一定要連續
create table 表名(
做主鍵的欄位1的具體資訊配置 primary key,
做主鍵的欄位2的具體資訊配置 primary key,
……
做主鍵的欄位m的具體資訊配置 primary key,
欄位m+1的具體資訊配置,
……
欄位n的具體資訊配置,
primary key(欄位名1,……,欄位名n)
);
建立編號作為主鍵和AUTO_INCREMENTl的連用的配置命令:
create table 表名(
做主鍵的欄位1的具體資訊配置 primary key AUTO_INCREMENTl,
……
欄位n的具體資訊配置
);
刪除某表的主鍵:
alter table 表名 drop primary key;
# 如果刪除的主鍵和AUTO_INCREMENTl連用了,就在刪除前,刪除一個約束
# alter table 表名 modify 欄位 該欄位原有的資訊 not null;
外來鍵(foreign key)
作用:讓當前表字段的值在另一個表中欄位值的範圍內選擇
條件:
1. 表的儲存引擎必須是innodb;
2. 兩邊的欄位型別必須要一致;
3. 被參照欄位必須要是唯一索引,不一定是主鍵,不過主鍵一定是可以作為被參考欄位的
注意:
1. 如果建立外來鍵的時候有 on update cascade on delete cascade 代表同步更新與刪除,如果修改或刪除被參考表中的被參考欄位,外來鍵所在表的資料也會隨著該表
2. 被參考表建立後必須有engine=innodb
3. 外來鍵也具有唯一性,只要被參考欄位擁有非空性,就可以把外來鍵設定為主鍵,具體就可以仿照已經建立表新增主鍵的操作
檢視
show create table 表名\G;
# 裡面一行資料如下
CONSTRAINT `外來鍵約束名稱` FOREIGN KEY (`外來鍵的欄位名`)
建立
# 新建立的表
create table 表名(
欄位1的具體資訊配置,
……
欄位n的具體資訊配置,
foreign key(自己表中作為外來鍵的欄位) references 被參照表(被參照欄位) on update cascade on delete cascade
)engine=innodb;
# 已經建立的表(不過這個表引擎一定是innodb)
alter table 表名 add foreign key(自己表中作為外來鍵的欄位) references 被參照表(被參照欄位) on update cascade on delete cascade;
刪除(要檢視外來鍵詳細詳細,才能得到外來鍵約束名稱)
alter table 表名 drop foreign key 外來鍵約束名稱;