所谓的数据的完整性就是,数据的准确性和可靠性。能够经过添加完整性约束来提升数据的完整性: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");