2012-03-25 14 views
5

私は2つのテーブルtable_aとtable_bを持っています。MySQL INSERTまたはSELECT

SELECT ID FROM table_a WHERE val = "123" 

値は、If:

CREATE TABLE `table_a` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`val` varchar(64) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `val` (`val`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

CREATE TABLE `table_b` (
`ref_a` int(11) unsigned NOT NULL, 
`data` int(11) unsigned NOT NULL, 
UNIQUE KEY `unique_index` (`ref_a`,`data`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

私は

これは私が達成しようとしているものですMASS REF_A値が表AのIDを参照して表Bに挿入したいと思います存在しない場合は、値を挿入してください。

INSERT INTO table_a(val) VALUES("123") 

IDを取得したので、 o table_b:

INSERT INTO table_b(ref_a, data) VALUES(1, 75) 

私は一括してやりたいときに問題が発生します。 一括挿入を実行する代わりにSELECTSとINSERTの間を交互に切り替え、一括選択するとパフォーマンスが低下しますか?

私が行うことができます:

INSERT INTO table_b(ref_a, data) VALUES((SELECT ID FROM table_a WHERE value="123"), 75) 

をしかし、値が欠落していると私は前に挿入を行う必要がある場合はどのような。

私はBEGIN TRANSACTIONとCOMMITを使用して、挿入後にテーブルAのIDを取得する必要があります。

は私も行うことができます。

  • バルク
  • が選択されたIDを使用して、テーブルBに挿入し、テーブルAからすべてのIDを選択して、テーブルA.
  • に挿入します。

しかし、私は代わりの方法を探しています。

私がやろうとしていることを達成するのに、最も効果的な方法は何でしょうか?

+1

これらの値(「123」、「75」)はどこから来ますか?別のテーブル?アプリケーション?ファイル? –

+0

'a.ID'は一意で、自動増分フィールドですか? – SenorAmor

+0

値123,75は別のテーブルから来たものです。これらの値にアクセスできます。 a.IDはユニークで、自動インクリメントあり – nick

答えて

1

私はあなたが右の挿入のためのチェックを行いますストアドプロシージャを使用することをお勧め:stored routine

それは与えられた値を持つエントリが存在するかどうか我々はチェック

CREATE PROCEDURE insertdata(IN i_value VARCHAR(32), IN i_data INT(11)) 
BEGIN 
DECLARE v_insertID INT DEFAULT -1; 

SELECT ID INTO v_insertID FROM table_a WHERE value = i_value; 

IF -1 = v_insertID 
THEN 
    INSERT INTO table_a(value) VALUES(i_value); 
    SELECT ID INTO v_insertID FROM table_a WHERE value = i_value; 
END IF; 

IF -1 != v_insertID 
THEN 
    INSERT INTO table_b(ref_a, data) VALUES(v_insertID, i_data); 
END IF; 

END 

ようになります、場合私たちはそれを作成せずに、create entry IDを取得し、table_bにデータを挿入します(エントリが実際に作成された場合)

したがって、各エントリのためにphpからルーチンを呼び出す必要があります。それは、はるかに多くの

+0

これは私が必要とするものです。前に関数を作成しようとしましたが失敗しました。ありがとう!それがどれほどうまくいくかがわかります – nick

3

まずあなたがtable_aの値列にUNIQUE INDEXを持っていることを確認してください(複数のMySQLの呼び出しが必要になります)、PHPでこれらすべてのテストをしているよりも、最適化され、その後、バルクを行うINSERT IGNORE

INSERT IGNORE INTO table_a(value) VALUES("123"), ("345"), ("afasd"), ("#$#$%"), ... 

これで、すべての値がtable_aに含まれていることが確認されました。安全にバルクtable_b挿入メソッドを使用できます。

関連する問題