7.1.1. MySQL设计局限与折衷

当使用MyISAM存储引擎时,MySQL使用极快速的表锁定,以便允许多次读或一次写。使用该存储引擎的最大问题出现在同一个表中进行混合稳定数据流更新与慢速选择。如果这只是某些表的问题,你可以使用另一个存储引擎。参见第15章:存储引擎和表类型

MySQL可以使用事务表和非事务表。为了更容易地让非事务表顺利工作(如果出现问题不能回滚)MySQL采用下述规则。请注意这些规则只适用于不运行在严格模式下或为INSERTUPDATE使用IGNORE规定程序时。

·         所有列有默认值。请注意当运行在严格SQL模式(包括TRADITIONAL SQL模式)时,必须为NOT NULL列指定默认值。

·         如果向列内插入不合适的或超出范围的值,MySQL将该列设定为“最好的可能的”,而不是报告错误。对于数字值,为0、可能的最小值或最大值。对于字符串,为空字符串或列内可以保存的字符串。请注意当运行在严格模式或TRADITIONAL SQL模式时该行为不 适用。

·         所有表达式的计算结果返回一个表示错误状况的信号。例如,1/0返回NULL(使用ERROR_FOR_DIVISION_BY_ZERO SQL模式可以更改该行为)

如果正使用非事务表,不应该使用MySQL来检查列的内容。一般情况,最安全的(通常是最快的)方法径是让应用程序确保只向数据库传递合法值。

相关详细信息参见1.8.6节,“MySQL处理约束的方式”13.2.4节,“INSERT语法”5.3.2节,“SQL服务器模式”

关注编程学问公众号