关于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将字符转换成数字

  1. 将字符的数字转成数字,比如'0'转成0可以直接用加法来实现
    例如:将pony表中的d 进行排序,可d的定义为varchar,可以这样解决
    select * from pony order by (d+0)

  2. 在进行ifnull处理时,比如 ifnull(a/b,'0') 这样就会导致 a/b成了字符串,因此需要把'0'改成0,即可解决此困扰

  3. 比较数字和varchar时,比如a=11,b="11ddddd";
    则 select 11="11ddddd"相等
    绝对比较可以这样:
    select binary 11 =binary "11ddddd"

  4. 字符集转换 : 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命令

你可能感兴趣的:(关于mysql的一些细节问题)