在各种PostgreSQL与MySQL比较中,我看到很多关于MySQL中数据完整性问题的提及。这目前仍然是一个问题?MySQL数据的完整性?
特别是对于使用MySQL的Web应用程序,是否有技巧确保数据完整性得到维护?或者是新版本,这是真正的'开箱即用',无需额外配置?
在各种PostgreSQL与MySQL比较中,我看到很多关于MySQL中数据完整性问题的提及。这目前仍然是一个问题?MySQL数据的完整性?
特别是对于使用MySQL的Web应用程序,是否有技巧确保数据完整性得到维护?或者是新版本,这是真正的'开箱即用',无需额外配置?
默认情况下,MySQL创建的myisam引擎表不支持事务或外键,您需要在创建表时显式强制事务性innodb引擎。
默认情况下,MySQL接受无效数据,如日期'2010-02-30',静静地截断太长的文本数据,太大的数字等等。但是你可以在mysql 5.0.2及更高版本上使用SET sql_mode = 'STRICT_TRANS_TABLES';
来更改INNODB表 - 见"Constraints on Invalid Data"。
MySQL不会在所有支持检查约束,所以你不能例如:
所以所有的数据验证都必须在客户端应用程序中完成。哪个更难做,更容易出错。
所有这些在PostgreSQL中都不是问题。
MySQL具有支持多个存储后端(存储引擎)的功能。最突出的是MyISAM和InnoDB。 MyISAM是默认设置,在许多情况下速度非常快,但不提供数据完整性。 InnoDB支持完整的数据完整性。创建表格时,您可以设置类型。
CREATE TABLE foo (...) ENGINE=innodb;
另请参阅http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html了解更多详情。
没有用于MySQL的存储引擎支持CHECK约束。 Nuff说。
“对于其他存储引擎,子句将被解析但忽略。CHECK子句将被解析,但会被所有存储引擎忽略。” “接受但忽略语法子句的原因是为了兼容性,使其更容易从其他SQL服务器移植代码,并运行创建具有引用的表的应用程序” - http://dev.mysql.com/doc/refman/5.1/en/alter-table.html根据手册,在MySQL 5.4或5.5中没有对此进行任何增强。
请注意,InnoDB确实支持FOREIGN KEY。
为什么这个问题是社区维基? – Tometzky 2010-05-14 13:56:37