所謂的數據的完整性就是,數據的準確性和可靠性。能夠經過添加完整性約束來提升數據的完整性:mysql
主鍵約束
要求:要求主鍵列數惟一,而且不能爲空,主鍵能夠包含表的一列或多列(能夠是一個列成爲主鍵,也能夠是幾個列組合成爲主鍵)。儘可能不要選擇業務數據爲主鍵。
做用:主鍵是惟一能肯定一行數據的字段。
建立主鍵的三種方式:sql
#例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 外表名(字段)ide
#例:添加外鍵約束 alter table table1 add constraint foreign key(須要設爲外鍵的字段) references table2(父表的關聯字段)
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`) ) ;
描述:在數據庫中用來加速對錶的查詢,經過使用快速路徑訪問的方法,快速定位數據,減小了磁盤的IO。
類型:B-Tree索引、位圖索引、哈希索引。在不一樣的存儲引擎中對索引的存儲策略不一樣:
- Myisam引擎:葉子節點中保存記錄的地址
- Innodb引擎:葉子節點中直接保存相應的數據。(B+樹索引)
索引的優勢:創建索引能夠加快查詢的速度,而下降增、刪、改的效率。
索引的建立:索引的建立分爲兩種:自動建立和手動建立:
- 自動建立:當在表中定義了一個主鍵,或者惟一約束時,數據庫會自動的建立一個對應的惟一索引。
- 手動建立:oop
#普通索引 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的級別:
使用索引的注意點:
- 索引與表是分開保存的,會佔用大量的磁盤空間
- 索引改善了檢索數據的性能,可是下降了增、刪、改數據的性能。
- 限制索引中索引數目。索引越多,數據庫的工做量越大
- 索引用於數據過濾和數據排序(表的數據量比較大,常用某些字段作排序和查詢,創建索引)性能
介紹:視圖是從若干個表和其餘視圖中構造出來的虛表,並不是是以物理文件保存數據,在執行過程當中動態從基表中獲取數據,以表爲底層。code
#例:建立視圖 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',錯誤。
對視圖的操做blog
#查詢視圖 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的DCL,由於公司都有本身的數據庫管理員,我們使用MySQL都會有特殊的權限限制,能經過特定的用戶,可是通過幾回的安裝集羣后發現,最初hadoop平臺搭建的時候,這個MySQL的受權操做還得本身來,每次都會由於hive初始化元數據庫、Azkaban組件安裝糾結半天。得嘞,本身總結下吧,以避免下次在糾結。
語法:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
CREATE USER 'hadoop'@'localhost' IDENTIFIED BY '123456'; CREATE USER 'hive'@'192.168.1.101' IDENDIFIED BY '123456'; CREATE USER 'hadoop'@'%' IDENTIFIED BY '123456'; CREATE USER 'hive'@'%' IDENTIFIED BY ''; CREATE USER 'azkaban'@'%';
建立用戶成功後,就能夠經過這個用戶登陸:
$mysql -hmysql_host -uhadoop -p123456
刪除用戶:
DROP USER 'username'@'host';
只有擁有特定權限的用戶才能執行特定的操做。
語法:
GRANT privileges ON dbname.tableanme TO 'username'@'host';
GRANT SELECT, INSERT ON test.user TO 'hadoop'@'%'; GRANT ALL ON *.* TO 'hadoop'@'%'; GRANT ALL ON maindataplus.* TO 'hadoop'@'%';
受權以後通常都會刷新該操做:
mysql>flush privileges;
撤銷受權:
REVOKE privilege ON databasename.tablename FROM 'username'@'host';
其中的內容與受權操做相似。
命令:
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
若是修改當前用戶的密碼則:
SET PASSWORD = PASSWORD("newpassword");
舉例:
SET PASSWORD FOR 'hadoop'@'%' = PASSWORD("123456");