日期:2014-05-16  浏览次数:20714 次

mysql技巧杂烩 (三)
1. Sequence
 
  a.可以把列定义为自增键。这跟Sql Server类似,跟Oracle不同。
      create table person(
        id int unsigned not null auto_increment,
        primary key(id)
        ...
      )
      和sql server一样,插入数据时不必指定自增键的值
 
  b.id最大的记录删除后,重新插入的数据的id是多少? 这个答案跟mysql的存储引擎有关。
     i.  对于bdb引擎,新的id = 现有id的最大值 + 1; 如果刚删除的最大id=8, 当前的id最大值=7,  则新的id = 7 + 1 =8 ! 也就是说,id =8 被重复使用了!
     ii. 对于MyISAM和InnoDB引擎,则可以保证id不会被重用
    
  c. 获取刚刚插入的记录的id:  select last_insert_id();  这个last_insert_id是connection级别的,所以不用担心会取到他人刚刚生成的id (但如果程序用了连接池呢?)
     

2.索引与约束
  a.使用了unique索引的列不允许值重复
    i. unique索引允许出现多个NULL值(不过,BDB引擎只允许一个NULL值)
   ii. 如果列的collation是ci的, 则不允许既有"abc"又有"ABC"; 如果是cs/bin,则允许
  b.InnoDB支持外键约束,其它的引擎目前(版本<=5.1)并不支持
  c.MySQL为数据完整性定义了一些“严格模式”和“非严格模式”。默认模式是非严格的,用户提交的错误数据一般并不会导致执行的中止,相反,MySQL会选择“最合适”的正确数据写入到库了。对无法回滚的引擎来说,这种思想很有意义。

3.事务
  a. InnoDB支持事务, MyISAM不支持
  b. sql 语法:
    #start transaction;
    #insert into ... ;
    #insert into ... ;
    #commit;  -- 或 rollback;
  c. MyISAM引擎下如果确要防止并发修改,可以使用表锁,不过表锁并不支持回滚:
     #lock table course write;  --锁住course表
     #update course set name = 'Rock' where name = 'History';
     #update course set name = 'Roll' where name = 'Math'; --如果这里出错,上一条语句并不会回滚
      #unlock table;

4.性能优化    
  a. 查看执行计划:explain select * from course where ...
  b. 让mysql重新生成统计信息:analyze table course;