带你了解MySQL数据库小技巧( 二 )


6、每个表中都要有一个主键吗?并不是每一个表中都需要主键 , 一般的 , 如果多个表之间进行连接操作时 , 需要用到主键 。因此并不需要为每个表建立主键 , 而且有些情况最好不使用主键 。
7、每个表都可以任意选择存储引擎吗?外键约束(FOREIGN KEY)不能跨引擎使用 。 MySQL支持多种存储引擎 , 每一个表都可 以指定一个不同的存储引擎 , 但是要注意:外键约束是用来保证数据的参照完整性 , 如果表之间需要关联外键 , 却指定了不同的存储引擎 , 这些表之间是不能创建外键约束的 。 所以说 , 存储引擎的选择也不完全是随意的 。
8、带AUTO_INCREMENT约束的字段值是从1开始的吗?默认的 , 在MySQL中 , AUTO_INCREMENT的初始值是1 , 每新增一条记录 , 字段值自动加1 。 设置自增属性(AUTO_INCREMENT)的时候 , 还可以指定第一条插入记录的自增字段的 值 , 这样新插入的记录的自增字段值从初始值开始递增 , 如在tb_emp8中插入第一条记录 , 同时指定id值为5,则以后插入的记录的id值就会从6开始往上增加 。 添加唯一性的主键约束时 , 往往需要设置字段自动增加属性 。
9、TIMESTAMP与DATATIME两者的区别TIMESTAMP与DATETIME除了存储字节和支持的范围不同外 , 还有一个最大的区别就是: DATETIME在存储日期数据时 , 按实际输入的格式存储 , 即输入什么就存储什么 , 与时区无关;而TIMESTAMP值的存储是以UTC(世界标准时间)格式保存的 , 存储时对当前时区进行转换 , 检索时再转换回当前时区 。 即查询时 , 根据当前时区的不同 , 显示的时间值是不同的 。
10、选择数据类型的方法和技巧是什么?MySQL提供了大量的数据类型 , 为了优化存储 , 提高数据库性能 , 在任何情况下均应使用 最精确的类型 。 即在所有可以表示该列值的类型中 , 该类型使用的存储最少 。

  • 整数和浮点数
如果不需要小数部分 , 则使用整数来保存数据;如果需要表示小数部分 , 则使用浮点数类 型 。 对于浮点数据列 , 存入的数值会对该列定义的小数位进行四舍五入 。 例如如果列的值的范 围为1?99999 , 若使用整数 , 则MEDIUMINT UNSIGNED是最好的类型;若需要存储小数 , 则 使用FLOAT类型 。 浮点类型包括FLOAT和DOUBLE类型 。 DOUBLE类型精度比FLOAT类型高 , 因此 , 如要求存储精度较高时 , 应选择DOUBLE类型 。
  • 浮点数和定点数
浮点数FLOAT , DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下 , 浮点 数能表示更大的数据范围 。 但是由于浮点数容易产生误差 , 因此对精确度要求比较高时 , 建议使 用DECIMAL来存储 。 DECIMAL在MySQL中是以字符串存储的 , 用于定义货币等对精确度要 求较高的数据 。 在数据迁移中 , float(M,D)是非标准SQL定义 , 数据库迁移可能会出现问题 , 最 好不要这样使用 。 另外两个浮点数进行减法和比较运算时也容易出问题 , 因此在进行计算的时候 ,一定要小心 。 如果进行数值比较 , 最好使用DECIMAL类型 。
  • 日期与时间类型
MySQL对于不同种类的日期和时间有很多的数据类型 , 比如YEAR和TIME 。 如果只需要 记录年份 , 则使用YEAR类型即可;如果只记录时间 , 只须使用TIME类型 。 如果同时需要记录日期和时间 , 则可以使用TIMESTAMP或者DATETIME类型 。 由于 TIMESTAMP列的取值范围小于DATETIME的取值范围 , 因此存储范围较大的日期最好使用 DATETIME 。 TIMESTAMP也有一个DATETIME不具备的属性 。 默认的情况下 , 当插入一条记录但并没 有指定TIMESTAMP这个列值时 , MySQL会把TIMESTAMP列设为当前的时间 。 因此当需要插入记录同时插入当前时间时 , 使用TIMESTAMP是方便的 , 另外TIMESTAMP在空间上比 DATETIME更有效 。
CHAR与VARCHAR之间的特点与选择