2 つのテーブルが一意の識別子「id」を共有しています。両方のテーブルは、'id' を使用して結合することを意図しています。両方のテーブルで「id」を自動インクリメント主キーとして定義すると、更新の不一致が発生する可能性があります。
このような状況を回避するための一般的なパターンはありますか、または最後に挿入された ID を使用して最初に table1 と table2 を更新する必要がありますか (したがって、id を table2 で auto inc として宣言しません)。
2 つのテーブルが一意の識別子「id」を共有しています。両方のテーブルは、'id' を使用して結合することを意図しています。両方のテーブルで「id」を自動インクリメント主キーとして定義すると、更新の不一致が発生する可能性があります。
このような状況を回避するための一般的なパターンはありますか、または最後に挿入された ID を使用して最初に table1 と table2 を更新する必要がありますか (したがって、id を table2 で auto inc として宣言しません)。
任意の数のテーブルで同じ列名「id」に問題はありません。
いくつかの永続層フレームワークは、同じ方法でそれを行います。
それに応じてテーブルを区別するために、SQL でエイリアスを使用するだけです。
最初に table1 を更新し、最後に挿入された id を後で使用して table2 を更新する必要がありますか (したがって、table2 で id を auto inc として宣言しません)。
はい。また、id を外部キーにして、table1 に既に存在する場合にのみ table2 に存在できるようにします。
はい、操作をトランザクションでラップすることを忘れないでください。
まず、MySQL で InnoDB テーブル エンジンを使用すると、データの一貫性のためにトランザクションと外部キーの両方を使用できます。
次に、最初のテーブルに挿入した後、(データベースへのアクセス方法に応じて) 最後の挿入 ID を取得し、それを外部キーとして使用できます。
例 表 1: Users
:user_id, username
表 2: User_Profiles
:user_id, name, phone
User_Profiles では、自動インクリメントとして定義する必要はありませんが、最初にテーブルにuser_id
レコードを挿入し、レコードにを使用します。トランザクションでこれを行う場合、レコードは完了するまでトランザクション接続の外に表示されません。このようにして、ユーザーを挿入した後、プロファイルを挿入する前に何か問題が発生した場合でも、問題が発生しないことが保証されます。データが台無しになることはありません。Users
user_id
User_Profiles
Users
user_id
テーブルの列がUser_Profiles
テーブルの外部キーであることを定義することもできUsers
ます。したがって、誰かがUsers
テーブルからレコードを削除すると、データベースは自動的に のレコードを削除しますUser_Profiles
。他にも多くのオプションがあります - 詳細をお読みください。