0

次のように MySQL データベースにデータを追加する必要があります。

Person: pId, nameId, titleId, age

Name: nameId, name

Title: titleId, title

データベースに名前やタイトルを複数回入れたくないので、解決策がわかりませんでしたLAST_INSERT_ID()

私のアプローチは次のようになります。

INSERT IGNORE INTO Name(name) VALUES ("Peter");
INSERT IGNORE INTO Title(title) VALUES ("Astronaut");
INSERT INTO Person(nameId, titleId, age) VALUES ((SELECT nameId FROM Name WHERE name = "Peter"), (SELECT nameId FROM Name WHERE name = "Astronaut"), 33);

しかし、それはかなり汚いアプローチだと思います!? 可能であれば、1 つのクエリで複数の人を追加し、db に複数回追加する必要はありません。これは良い方法で可能ですか?ありがとう!

4

1 に答える 1

0

タイトルと名前をテーブルの 2 つの列として配置し、次のようにすることができます。

  • UNIQUEDB で同じ 2 つのタイトルまたは 2 つの名前を保持したくない場合は、各列に1 つのインデックスを設定します。
  • または、同じ名前同じタイトルを持つ 2 つのエントリを保持したくない場合は、UNIQUEインデックスをオンに設定します。(title,name)

本当に別のテーブルが必要な場合は、投稿で提案したように行うことができますが、すべての挿入ステートメントを でラップして、TRANSACTIONどこかで重複を検出した場合にロールバックできるようにします。

設計のジレンマを参照してください: メールアドレスが既に使用されている場合、「メールアドレスは既に登録されています」というメールを送信しますが、まったく同じ問題のように見えるテーブルに重複を追加できないため、送信できませんが、名前と名前が &名前と役職の代わりに電子メール。

START TRANSACTION;
INSERT INTO title(value) VALUES ("Prof.");
SELECT LAST_INSERT_ID() INTO @title_id; 
    -- Instead of using user-defined variable, 
    -- you should be able to use the last_insert_id 
    -- equivalent from the host language MySQL driver.
INSERT INTO username(value) VALUES ("Sylvain");
SELECT LAST_INSERT_ID() INTO @username_id;
    -- Instead of using user-defined variable, 
    -- you should be able to use the last_insert_id 
    -- equivalent from the host language MySQL driver.

INSERT INTO account(username_id, email_id) VALUES (@username_id,@title_id); 
COMMIT;

見るLAST_INSERT_ID()


3 番目の解決策は、SELECT挿入を行う前に、エントリが既に存在することを確認することです。しかし、個人的には、少なくともチェック・ビフォア・セットのアプローチを推進するつもりはありません。これには、正しくインデックスを使用する場合、ほとんど不要な追加のクエリが必要になります。

于 2013-08-10T12:20:39.863 に答える