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;