12月03, 2015

MYSQL杂七杂八

MYSQL 文档 https://dev.mysql.com/doc/refman/5.7/en/

表复制

create table t2 like t1;
insert into t2 select * from t1;

创建索引

主键索引、唯一索引、普通索引、全文索引(自带的对中文支持不好,全文索引详见其他文章)
比较简单,我就不写了。

视图

SELECT 语句不能包含FROM子句中的子查询
SELECT 语句中不能引用系统或用户变量
SELECT 语句不能引用预处理语句参数
在存储子程序内,定义不能引用子程序参数或局部变量
在定义中引用的表或视图必须存在。但是,创建视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。
在视图定义中命名的表必须已存在。
不能将触发程序与视图关联在一起。
在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图又使用了具有自己ORDER BY的语句,它将被忽略。
不能给视图添加索引。

视图通常是不允许更新的,能更新的视图比较少,条件也比较苛刻。只要SQL语句中含有下面任何一个子句,都会限制视图的更新:
    聚合函数(SUM()、MIN()、MAX()、COUNT()等)。
    DISTINCTGROUP BYHAVINGUNIONUNION ALL。
    位于选择列表中的子查询。
    JOINFROM子句中的不可更新视图。
    WHERE子句中的子查询,引用FROM子句中的表。
    仅引用文字值(在该情况下,没有要更新的表)。
    ALGORITHM=TEMPLABLE(使用临时表总会是视图成为不可更新的)。

关于可插入性(可用INSERT语句更新),如果满足关于视图的列的下叙额外要求,可更新的视图也是可插入的:
    不得有重复的视图列名称。
    视图必须包含没有默认值的基表中的所有列。
    视图列必须是简单的列引用而不是导出列。

其实以上要求综合起来就一句话:视图的数据和基表表的数据不一样。因此视图一般用于查询的目的。那么使用视图有什么好处呢?
首先,实现了更细致的权限控制。比如你查询学生表,允许你知道学生姓名,但不允许看到学生的联系方式。这是就可以定义一个视图,仅包含学生姓名,并赋予使用者此视图的权限。这样就屏蔽了使用者对基础表的使用权限,仅暴露给其使用的字段。虽然给表字段分配用户权限也能达到同样的效果,但是如果涉及多表关联时,远没有视图灵活和直观。
其次,把业务中常用的SQL语句用一个视图来表示,可使查询语句更直观。
最后,性能优势虽在MYSQL中不存在,但是ORACLE等商业数据库中,视图支持更多的特性,如物化视图。

内置函数

链接 https://blog.hijs.cc/post/mysql-func.html

预处理语句

设置stml1预处理,传递一个数据作为一个where判断条件:
mysql> prepare stmt1 from 'select * from t1 where id>?';
设置一个变量:
mysql> set @i=1;
执行stmt1预处理:
mysqll> execute stmt1 using @i;
设置@i为5:
mysql> set @i=5;
再次去执行stmt1:
mysql> execute stmt1 using @i;
如何删除预处理stmt1:
mysql> drop prepare stmt1;

事务处理

关闭自动提交功能
mysql> set autocommit=0;
从表t1中删除了一条记录
mysql> delete from t1 where id=11;
此时做一个p1还原点:
mysql> savepoint p1;
再次从表t1中删除一条记录:
mysql> delete from t1 where id=10;
再次做一个p2还原点:
mysql> savepoint p2;
此时回复到p1还原点,当然后面的p2这些还原点自动会失效
mysql> rollback to p1;
退回到最原始的还原点:
mysql> rollback;
mysql> START TRANSACTION;
Query OK, 0 rows affected
mysql> delete from a;
Query OK, 6 rows affected
mysql> rollback;
Query OK, 0 rows affected
mysql> START TRANSACTION;
Query OK, 0 rows affected
mysql> delete from a where id =1;
Query OK, 1 row affected
mysql> commit;
Query OK, 0 rows affected

触发器

 下次补充

正则表达式


外键


忘记MySQL密码

1.KILL掉系统里的MySQL进程;
    killall -TERM MySQLd 
2.用以下命令启动MySQL,以不检查权限的方式启动;
    safe_mysqld --skip-grant-tables & 
3.然后用空密码方式使用root用户登录 MySQL;
    MySQL -u root 
4.修改root用户的密码;
    MySQL> update MySQL.user set password=PASSWORD('新密码') where User='root';  
    MySQL> flush privileges;  
    MySQL> quit

本文链接:https://blog.hijs.cc/post/mysql-other.html

-- EOF --

Comments