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;

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.