2009-07-28 7 views
1

私は、リレーショナルテーブルを扱っていると私は、テーブルにデータを挿入するときに確認する必要があり、クエリの数を低くする方法がある場合、私は思ってきた...ここでこれはMySQL上のリレーショナルテーブルを効率的にクエリする方法ですか?

私が現在使用してクエリは、次のとおりです。

「メイン」の値を挿入します。

INSERT INTO products 
     (title, description, status, url) 
    VALUES 
     ('some title', 'description of doom', 1, 'some-title'); 

すでに存在しない場合にのみ値を挿入します。

INSERT IGNORE INTO values 
      (value) 
     VALUES 
      ('example value'); 

私は、クエリが実際に挿入された場合、私はIDを取得わからないので...

  SELECT id 
       FROM 
        values 
       WHERE 
        value = 'example value'; 

"?"最後のクエリから取得したIDです。

   INSERT INTO link 
         (id_product, id_catalog, id_value) 
        VALUES 
         (33, 1, ?); 

これは、私が追加する必要がある余分な値が3つのクエリにかかることを意味します。だから私の質問です:これを行うより効率的な方法はありますか?

+0

これは実際に私にそれを行うにはかなり良い方法のように見えます。 –

答えて

1

あなたは、少なくともクエリの一滴にこれを行うことができます「?」私は基本的に交換しています

INSERT INTO link 
    (id_product, id_catalog, id_value) 
VALUES 
    (33, 1, (SELECT id 
       FROM values 
       WHERE value = 'example value')); 

をIDを取得するための2番目のクエリのサブセレクトを使用します。

+0

'example value'が既に存在する場合はどうなりますか?重複は無視されますか? –

+0

あなたの制約によって違反します。 – northpole

+0

だから...あなたはエラーを強制していますか? –

0

"これを行うより効率的な方法はありますか?"

いいえ。 3つのものを作成するには、3つの挿入が必要です。

0

MySQL内部からROW ___ COUNT()関数で挿入が成功したかどうかを知ることができます。別の言語(PHPなど)からの呼び出しの場合、mysql_queryまたは同等の関数は行数を返します。

0

INSERT INTO ... ON DUPLICATE KEY UPDATEステートメントを使用できます。

しかし、これは主キーが挿入の値の1つである必要があるため、自動インクリメントのテーブルでは機能しません。

関連する問題