親テーブルのデータ型を変更しても、MySQL は子テーブルのデータ型を変更しません。
Users
テーブルの INT 値が最大に達したコンサルティング顧客の 1 人を助ける必要がありました。しかし、ご想像のとおり、 を参照する他の 30 のテーブルがありましたUsers
。ALTER TABLE
テーブルの主キーのデータ型を変更する前に、他の 30 個のテーブルのそれぞれを変更する必要がありましUsers
た。これは、新しいユーザー ID が子テーブルによって参照されないと機能しないためです。
外部キーに関する質問については、はい、データの整合性を確保するために外部キーをお勧めします。私が分析したすべてのデータベースで、外部キーなしで実行しようとしたところ、子テーブルに多くの孤立した行があり、それらを自動的に検出する方法がありませんでした。
とはいえ、孤立したデータを避けるためにアプリケーションコードで「正しいことをする」と仮定して、サイトが外部キーを放棄することは驚くほど一般的です。
外部キーに対する反論の 1 つは、外部キーの存在によって予期しないロックが発生する場合があるということです。子行を UPDATE すると、トランザクションの間、その行がロックされることが予想されます。ただし、外部キーがある場合は、外部キーによって参照されるテーブルの親行もロックされます。
例: 親テーブルShoppingCart
と子テーブルがあるとしますLineItems
。で行の数量を UPDATE すると、LineItems
トランザクションはその行に対して排他ロック (X ロック) を作成します。ただし、 の親行に共有ロック (S ロック) も作成しShoppingCart
ます。たとえば、その行を参照している行の 1 つで作業を進めているときに、依存している行を DELETE したくないのは理にかなっています。
これは共有ロックであるため、複数のトランザクションが同時にこの種のロックを持つことができますが、1 つ以上のクライアントが暗黙的な共有ロックを保持しているときに親行を直接更新する必要がある場合は、ブロックされます。