2010-05-14 95 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