よく比較記事があるので大きな違いとかはそういうのを参考にするとして、もっと細かい機能の違いをメモしておきます。
違うところ、とタイトルをつけましたが、 どっちかというと「MySQL出来ないことリスト」 みたいなことになりそう。壁にぶつかる度に増やしていきます。
チェック制約にストアド関数が着かない
ソースはこちら。
Stored functions and loadable functions are not permitted.
MySQLではチェック制約はあくまでもそのテーブル内の情報で制約をつくるようです。
これがなにが困るかというと、ストアド関数が書けないと言うことはつまり、別のテーブルを参照したチェックが出来ないんですよね。SQLAlchermy の Joined Table Inheritance(結合テーブル継承)を使っていると、「自分のカラムと親テーブルのカラムの複合で一意」とかを表現したくなるんですが、それができないのです。
トランザクションの制約検査のタイミングが設定できない
ソースはこちら
InnoDB checks foreign key constraints immediately; the check is not deferred to transaction commit.
これは外部キー制約ですが、PostgreSQLでは外部キー制約の評価をコミット時まで遅延させられられすオプションがあるのですが、MySQLでは即時評価しかないようです。
これも地味にしんどかった。ちょっと条件は忘れてしまいましたが、制約が循環するようなデータ(最終的には整合性が保てているが、途中では片方の制約が違反の状態が生まれる)をどうしてもつくりたくて、結局制約を断念した経緯があり、この制限に悩まされました。
DROP CONSTRAINT に IF EXISTS をつけられない
PostgreSQLとの違いというか、MySQL ではこの方言を採用していないです。
ソースというか 2006 年に却下されているのがこちら
I do not think that addining new (non-standard) IF EXISTS subclauses to ALTER TABLE is needed.
この機能が無いのでマイグレーションがわりとめんどくさいことになります。
なんと MariaDB にはあるらしい。頑なに採用してない is 何故。
マテリアライズドビューがない
これは有名ですかね。サブクエリをマテリアライズドビューにして速度改善、みたいなことは出来なさそうです。
ソースというかないものはないのですが、こちら。
MySQL 8.0 にはマテリアライズドビューはありますか。
いいえ。