2

2 つのテーブルが一意の識別子「id」を共有しています。両方のテーブルは、'id' を使用して結合することを意図しています。両方のテーブルで「id」を自動インクリメント主キーとして定義すると、更新の不一致が発生する可能性があります。

このような状況を回避するための一般的なパターンはありますか、または最後に挿入された ID を使用して最初に table1 と table2 を更新する必要がありますか (したがって、id を table2 で auto inc として宣言しません)。

4

4 に答える 4

1

任意の数のテーブルで同じ列名「id」に問題はありません。

いくつかの永続層フレームワークは、同じ方法でそれを行います。

それに応じてテーブルを区別するために、SQL でエイリアスを使用するだけです。

于 2012-09-18T14:44:23.773 に答える
1

最初に table1 を更新し、最後に挿入された id を後で使用して table2 を更新する必要がありますか (したがって、table2 で id を auto inc として宣言しません)。

はい。また、id を外部キーにして、table1 に既に存在する場合にのみ table2 に存在できるようにします。

于 2012-09-18T14:44:28.833 に答える
1

はい、操作をトランザクションでラップすることを忘れないでください。

于 2012-09-18T14:44:29.467 に答える
1

まず、MySQL で InnoDB テーブル エンジンを使用すると、データの一貫性のためにトランザクションと外部キーの両方を使用できます。

次に、最初のテーブルに挿入した後、(データベースへのアクセス方法に応じて) 最後の挿入 ID を取得し、それを外部キーとして使用できます。

例 表 1: Users:user_id, username 表 2: User_Profiles:user_id, name, phone

User_Profiles では、自動インクリメントとして定義する必要はありませんが、最初にテーブルにuser_idレコードを挿入し、レコードにを使用します。トランザクションでこれを行う場合、レコードは完了するまでトランザクション接続の外に表示されません。このようにして、ユーザーを挿入した後、プロファイルを挿入する前に何か問題が発生した場合でも、問題が発生しないことが保証されます。データが台無しになることはありません。Usersuser_idUser_ProfilesUsers

user_idテーブルの列がUser_Profilesテーブルの外部キーであることを定義することもできUsersます。したがって、誰かがUsersテーブルからレコードを削除すると、データベースは自動的に のレコードを削除しますUser_Profiles。他にも多くのオプションがあります - 詳細をお読みください。

于 2012-09-18T14:44:42.363 に答える