1. 程式人生 > >MySQL的進階部分

MySQL的進階部分

mysql ace alt 磁盤 一個 其他 tno 支持 ble

1.MySQL的表的約束

(1)數據完整性的介紹:

  所謂的數據的完整性就是,數據的準確性和可靠性。可以通過添加完整性約束來提高數據的完整性:

  • 實體完整性:為每一個實體(記錄)確定一個唯一標識。
    • 實現方式:主鍵約束、唯一約束、主鍵自增
  • 域完整性:表示字段是完整的
    • 實現方式:字段的類型、非空約束、默認值
  • 引用完整性:參照表和被參照表
    • 實現方式:外鍵約束
  • 自定義完整性:自定義某些字段的範圍
    • 實現方式:檢查約束(MySQL暫不支持)

(2)表字段添加約束和刪除

主鍵約束
  要求:要求主鍵列數唯一,並且不能為空,主鍵可以包含表的一列或多列(可以是一個列成為主鍵,也可以是幾個列組合成為主鍵)。盡量不要選擇業務數據為主鍵。

   作用:主鍵是唯一能確定一行數據的字段。
創建主鍵的三種方式:

#例1:
#創建字段的時候添加約束
create table stu(
id int primary key ,
sname varchar(20));
#例2:
#最後添加約束
create table stu(
id int ,
sname varchar(20),
primary key(id));
#例3
#表已經創建,然後添加約束
create table stu(
id int  ,
sname varchar(20));
alter table stu add constraint ky_id primary key(id);

ps:如果想加入主鍵自增,只需要在primary key 後面加入:auto_increment

刪除主鍵約束:

#刪除主鍵約束,首先要刪除他的主鍵自增,然後在刪除:
alter table stu modify id int //刪除主鍵自增
alter table stu drop primary key;  //刪除主鍵約束

唯一約束
  要求:要求該列唯一,允許為一個空。

#例:
alter table stu add constraint unique(sname) 

刪除唯一約束

#在刪除唯一約束時,首先需要刪除索引,因為在創建唯一約束時默認會創建一個索引
alter table stu drop index sname
alter table stu drop index 唯一約束名

非空約束
  要求:某類內容不允許為空
  語法:name varchar(50) not null
默認值
  要求:當字段沒有給固定的值得時候,自動賦初值。
  語法:name varchar(50) default ‘zs’;
外鍵約束
  要求:一個表中的某個字段必須與另一張表中的某個字段相等,如果不相等,或者另一張表沒有這個值,則存儲失敗。
  語法:foreign key(表的字段) references 外表名(字段)

#例:添加外鍵約束
alter table table1 add constraint foreign key(需要設為外鍵的字段) references  table2(父表的關聯字段)

(3) 舉例:

CREATE TABLE `t_book` (
  `bid` int(10) NOT NULL,
  `bname` varchar(50) NOT NULL,
  `price` double DEFAULT NULL,
  `author` varchar(50) DEFAULT NULL,
  `authorid` int(10) DEFAULT NULL,
  PRIMARY KEY (`bid`),
  UNIQUE KEY `author` (`author`)
) ;

2.MySQL的索引

  描述:在數據庫中用來加速對表的查詢,通過使用快速路徑訪問的方法,快速定位數據,減少了磁盤的IO。
  類型:B-Tree索引、位圖索引、哈希索引。在不同的存儲引擎中對索引的存儲策略不同:
    - Myisam引擎:葉子節點中保存記錄的地址
    - Innodb引擎:葉子節點中直接保存相應的數據。(B+樹索引)
   索引的優點:建立索引可以加快查詢的速度,而降低增、刪、改的效率。
   索引的創建:索引的創建分為兩種:自動創建和手動創建:
     - 自動創建:當在表中定義了一個主鍵,或者唯一約束時,數據庫會自動的創建一個對應的唯一索引。
     - 手動創建:

#普通索引
create index index_name on t_name(field)
#唯一索引
create unique index index_name on t_name(field)
#復合索引
create  index index_name on t_name(field1,field2)

   索引的使用條件:當通過設置索引的字段作為過濾條件時查詢的語句,才會用到索引。
   索引的效率
在查詢時使用:explain select * from emp where ename=‘scott‘; explain關鍵字用於查看索引的效率:
技術分享圖片
關於type的級別:
技術分享圖片
   使用索引的註意點
    - 索引與表是分開保存的,會占用大量的磁盤空間
    - 索引改善了檢索數據的性能,但是降低了增、刪、改數據的性能。
    - 限制索引中索引數目。索引越多,數據庫的工作量越大
    - 索引用於數據過濾和數據排序(表的數據量比較大,經常使用某些字段做排序和查詢,建立索引)

3.MySQL的視圖

   介紹:視圖是從若幹個表和其他視圖中構造出來的虛表,並非是以物理文件保存數據,在執行過程中動態從基表中獲取數據,以表為底層。

#例:創建視圖
create view v_viem as select * from emp1 where deptno =20;
#修改視圖:
update v_viem set deptno=10;
#查詢視圖
select * from v_viem;
註意:視圖一般不建議進行刪除、修改操作,因為他會影響到基表。以上的案例表示:如果修改了創建視圖的條件字段,但是視圖在查詢時還按照原有的條件查詢,會導致查詢的數據不準確。
# 控制視圖 不能修改字段:
CREATE 
    OR REPLACE VIEW v_emp AS SELECT
    * 
FROM
    emp 
WHERE
    deptno = 20 WITH CHECK OPTION;
    註意:使用上面的方式,創建視圖,如果想對視圖的條件字段進行修改,就會出現:
1369 - CHECK OPTION failed ‘db1807.v_emp‘,錯誤。

   對視圖的操作

#查詢視圖
select * from v_emp;
#在視圖中插入數據
insert into v_emp(field1,field2,field3) values(value1,value2,value3)
#重建視圖
create or REPLACE view t_view as select * from emp where sal >2000
#銷毀視圖
drop view view_name

   視圖的優點:
    - 安全性:bao保密敏感字段
    - 提高查詢效率
    - 定制化SQL:可以將多張表中經常被使用的數據放置在視圖中,快速查詢。

MySQL的進階部分