关于mysql的一些细节问题
1. MySQL删除有外键约束的表
当删除的表中的字段被用作了其他表的外键,因此在删除这个表(父表)之前必须先删除具有外键的表(子表)。也就是说,删除表的过程需要和创建表的过程一致。
但如果数据库表格之间关系太复杂,数量太多,操作起来就很麻烦。
因此,MySQL中提供了一个变量FOREIGN_KEY_CHECKS来设置是否在必要的时候检查外键约束。即MySQL的外键约束是可控的。
在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。
下面2个步骤暴力删除
SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = MyDatabaseName;
/*MyDatabaseName是你数据库的名称*/
SET FOREIGN_KEY_CHECKS = 0
-- DROP语句
SET FOREIGN_KEY_CHECKS = 1;
2. 如何给表中的某个字段授权
先给此字段创建一个视图,接着对视图授权。
3. where语句中不能出现聚集函数
聚集函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对数据行进行过滤的(这里过滤是在一个记录里边过滤的,基于"行"),在筛选过程中依赖“基于已经筛选完毕的数据得出的计算结果”是一种悖论,这是行不通的。更简单地说,因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!
而where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。
4. 区分大小写比较
where子句的字符串比较是不区分大小写的,但是可以使用binary关键字设定where子句区分大小写。
select * from table1 where binary name = 'li';
5. mysql将字符转换成数字
-
将字符的数字转成数字,比如'0'转成0可以直接用加法来实现
例如:将pony表中的d 进行排序,可d的定义为varchar,可以这样解决
select * from pony order by (d+0) -
在进行ifnull处理时,比如 ifnull(a/b,'0') 这样就会导致 a/b成了字符串,因此需要把'0'改成0,即可解决此困扰
-
比较数字和varchar时,比如a=11,b="11ddddd";
则 select 11="11ddddd"相等
若绝对比较可以这样:
select binary 11 =binary "11ddddd" -
字符集转换 : CONVERT(xxx USING gb2312)
类型转换和SQL Server一样,就是类型参数有点点不同 : CAST(xxx AS 类型) , CONVERT(xxx,类型),类型必须用下列的类型:
可用的类型:二进制,同带binary前缀的效果 : BINARY 字符型,可带参数 : CHAR() 日期 : DATE 时间: TIME 日期时间型 : DATETIME 浮点数 : DECIMAL 整数 : SIGNED 无符号整数 : UNSIGNED
6. 三种注释写法
#DELETE FROM SeatInformation
/*DELETE FROM SeatInformation */
-- DELETE FROM SeatInformation
需要特别注意 -- 这种注释后面要加一个空格
7. 清除MySQL查询缓存与测试性能
#关闭查询缓存
set global query_cache_size = 0;
set global query_cache_type = off;
#查询系统环境变量
show variables like '%pro%';
set profiling=1; #开启性能测试功能
-- 需要测试的sql语句
show profiles;
#清空查询缓存
RESET QUERY CACHE
# set sql_safe_updates=0; #非主键条件下无法执行update或者delete命令