MySQL数据完整性?

时间:2010-05-14 12:48:16

标签: mysql postgresql web-applications

在各种PostgreSQL与MySQL的比较中,我看到很多提到MySQL中数据完整性的问题。这目前还是个问题吗?

特别是对于使用MySQL的Web应用程序,是否有确保数据完整性的技巧?或者新版本是否真的“开箱即用”,无需额外配置?

3 个答案:

答案 0 :(得分:3)

MySQL具有支持多个存储后端(存储引擎)的功能。最突出的是MyISAM和InnoDB。 MyISAM是默认设置,在很多情况下都非常快,但没有提供数据完整性。 InnoDB支持完整的数据完整性。创建表时,您可以设置类型。

CREATE TABLE foo (...) ENGINE=innodb;

有关详细信息,另请参阅http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

答案 1 :(得分:3)

默认情况下,MySQL创建了myisam引擎表,它不支持事务或外键,您需要在创建表时显式强制使用事务性innodb引擎。

默认情况下,MySQL接受无效数据,例如日期'2010-02-30',默默地截断太长的文本数据,太大的数字等。但是你可以在mysql 5.0上使用SET sql_mode = 'STRICT_TRANS_TABLES';为INNODB表更改它。 2及以上 - 见"Constraints on Invalid Data"

MySQL根本不支持检查约束,所以你不能例如:

  • 强制整数数据为某些 范围;
  • 强制文本数据采用某种格式(例如有效的电子邮件 地址或有效网址);
  • 将文本数据限制为有效字符(仅限ASCII,仅限ISO-8859-1 数字和减号等;);
  • 禁止空格,换行符,双空格,末尾空格等。 或空文本数据。

因此,所有数据验证都必须在客户端应用程序中完成。哪个更难做,更容易出错。

所有这些都不是PostgreSQL中的问题。

答案 2 :(得分:-1)

没有用于MySQL的存储引擎支持CHECK约束。努夫说。

“对于其他存储引擎,子句被解析但被忽略.CHECK子句被解析但被所有存储引擎忽略。” “接受但忽略语法子句的原因是兼容性,以便更容易从其他SQL服务器移植代码,以及运行创建带引用的表的应用程序” - http://dev.mysql.com/doc/refman/5.1/en/alter-table.html MySQL 5.4或5.5中没有增强功能根据手册。

请注意InnoDB支持FOREIGN KEY。