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的進階部分