在各種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