1. 程式人生 > >Linux資料庫管理——day2——基本約束、主外來鍵

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 外來鍵約束名稱;