2010-05-14 97 views
1

在各种PostgreSQL与MySQL比较中,我看到很多关于MySQL中数据完整性问题的提及。这目前仍然是一个问题?MySQL数据的完整性?

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

+0

为什么这个问题是社区维基? – Tometzky 2010-05-14 13:56:37

回答

3

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

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

MySQL不会在所有支持检查约束,所以你不能例如:

  • 力整型数据是在一些 范围;
  • 强制文本数据为某种格式(例如,有效的电子邮件地址或有效url为 );
  • 将文本数据限制为有效字符(仅ASCII,仅限ISO-8859-1,仅限 数字和负号等);
  • 不允许空格,换行符,双空格,末尾空格等 或空文本数据。

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

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

3

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

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

另请参阅http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html了解更多详情。

-1

没有用于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。

+0

-1。误导。相同的手册说:FOREIGN KEY和REFERENCES子句受InnoDB存储引擎支持.... – Quamis 2014-05-16 15:07:55

+0

外键不是CHECK约束。请修改您的负面反馈。 – 2014-06-05 14:27:39

+0

我不能:)“您最后一次投票于5月16日15:06您的投票现在被锁定,除非这个答案被编辑。” – Quamis 2014-06-05 14:54:42