2016-09-06 25 views
0

2つのMySQLテーブルを作成しました。 1つはstaging_part_typeと呼ばれ、実際にpart_typeレコードがpart_typeと呼ばれ、product_codeのレコードが存在しないCSVをインポートするものです。どちらの表も同じで、列はid, in_use, default_name, product_codeです。MySQLを1つのテーブルから選択し、別のテーブルに挿入

このようなことをする特定の名前はありますか?私はこれに関する完全なチュートリアルを見つけられませんでした。別のものだけが集まりました。私はこのテーマでの経験が不足しているため、それらを一緒に作業クエリに入れません。そして、読書の1週間後に、やっている。

これは何か?

INSERT IGNORE INTO part_type (in_use, default_name, product_code) 
     SELECT (in_use, default_name, product_code) 
      FROM staging_part_type  
      WHERE part_type.product_code IS NOT staging_part_type.product_code; 

テーブルを作成するコードは、名前を除いてすべて同じです。

CREATE TABLE IF NOT EXISTS `part_type` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `in_use` tinyint(1) NOT NULL, 
    `default_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `product_code` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=580 ; 

誰かがこれを行う方法を教えてください、またはこのテーマに関するリソースを教えてください。

答えて

2

SQLではよくあることですが、サブクエリと結合を使用して、これを行うには2つの方法があります。

サブクエリメソッドは理解しやすく、記述するのが簡単ですが、結合メソッドがより効率的であり、これがミッションクリティカルなクエリであれば何をするのでしょうか。

あなただけのシンプルなCSVをインポートしているので、我々はこのように動作します「が存在する」と「相関サブクエリ」、使用します。

INSERT INTO part_type (in_use, default_name, product_code) 
    SELECT in_use, default_name, product_code 
     FROM staging_part_type  
     WHERE NOT EXISTS 
      (SELECT product_code FROM part_type WHERE product_code = staging_part_type.product_code) 

あなたは右の線に沿って考えていたが、あなたが必要とします2つのクエリを設定してリンクします。カッコ内のクエリが実行され、戻ってくる結果は行にまだ存在していないものだけです。最初に2行目以降を実行して、元に戻すものを確認してから、最初の行を追加して挿入を実行してください。

+0

非常にエレガントで、正確にファイルが非常に小さいので、私はこの状況のた​​めに必要なものです。私は現在、Gillensonのデータベース管理システムの基礎を勉強しています。それは取り入れることがたくさんありますが、JoinがSubqueryとどのように違うのかを見ていきます。 –

1

典型的な方法はpart_typeに一意のインデックス/制約で開始し、次いでon duplicate key updateを使用することである。

CREATE UNIQUE INDEX unq_part_type_product_code ON part_type(product_code); 

INSERT INTO part_type (in_use, default_name, product_code) 
    SELECT in_use, default_name, product_code 
    FROM staging_part_type 
    ON DUPLICATE KEY UPDATE product_code = VALUES(product_code); 

この方法の利点。まず、一意のインデックスを使用して製品コードを検索します。追加のルックアップを行う必要はありません(ただし、実行できます)。

第2に、SETは動作しないため、変更されるレコードの数が増加することはありません。

第3に、これはキーの重複によって発生したエラー(おそらくproduct_codeのみ)を無視します。他のエラーは無視されません。

第4に、必要に応じてステージングテーブルから他の値を渡すことができます。

第5に、競合条件がありません。データベースによって、product_codeの一意性が保証されます。

+0

私はこれのコンセプトが好きで、 'product_code'を一意にしました。しかし、文のSET部分に構文エラーが発生しています。http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.htmlには少し違うようですが、元のものと置き換わるようです。 –

+0

@G_V。 。 。これは、 'SET'が構文の一部ではないためです。 'UPDATE'の後にちょうど私に似ているので、時々追加します。 –

関連する問題