私のサイトには、ユーザーとゲストの 2 種類の人がいます。作成/認証プロセスを除いて、実質的には同じです。
現時点では、2 つのテーブルがあります。
t_users
userId[PRIMARY, AUTOINC] username[UNIQUE]
t_guests
guestId[PRIMARY, AUTOINC] userId
誰かがサイトに入ると、スクリプトは次のことを行います。
1) t_guests に新しい行を挿入して、新しいゲスト レコードを作成します。
2) 前のステップで生成されたゲスト ID (ゲスト ユーザー名 = 「ゲスト ゲスト ID」) を使用して、t_users に新しいレコードを追加します。
3) ステップ 2 で割り当てられたゲスト レコード設定の userId を更新します。
多くの脆弱性が含まれているため、このデータベース設計はひどいものだと思います。たとえば、ユーザー名 "Guest xyz" が t_users テーブルに既に存在する場合、ステップ 2 は失敗し、ステップ 3 は userId に間違った値を割り当てます (実装によっては、ステップ 1 で割り当てられた 0 またはゲスト ID になります)。
実際には、ゲストの一意のユーザー名を生成するための自動インクリメント機能に t_guests テーブルのみが必要です。統合テーブルを 1 つだけ使用し、単一のクエリを使用してゲストを登録する方法はありますか?
更新:次のようにして、単一のテーブルにゲストを挿入できます。
SELECT @mg := IFNULL(MAX(guestId), 0) + 1 FROM t_users;
INSERT INTO t_users (guestId) VALUES(@mg);
しかし、これら 2 つのステートメントの実行の間に t_users に新しいゲスト レコードを挿入する人がいないことは確かではありません。また、guestId を一意にすることはできません。実際のユーザーはそれをゼロにするからです。