2017-10-26 11 views
0

他のテーブルの情報に基づいてテーブルに行を挿入/更新する必要があります。私は例を挙げて、私の下の要件を説明します。表の下分割され、MySQLの新しいテーブルに挿入/更新される文字列を持つ列のストアドプロシージャ

私は更新したい場所/ Iは、データをコピーし、それをテーブルにインポートしたい場所をTAB1表の下

tab1_id | tab1_question_id | tab1_sectorID | tab1_NC_id 

1  | 101    | 11   | 21 

があるテーブルのテーブル名の既存のデータに基づいてデータを挿入していますtab1の

tab2_id | tab2_question_id | tab2_sectorID | tab2_NC_ids |import_complete 

1  | 101    | 11   | 21,22,23  | 0 
2  | 102    | 11   | 22,23,24  | 0 
3  | 103    | 11   | 22,24,25  | 0 
  • tab2_NC_idsは異なるNCのカンマで区切っての値を持ちます。今私はこれらの値をtab1テーブルに挿入しようとしています。 TAB1に例えば
  • はをquestion_idとNC_id 既に存在しています。だから、その行は、私は TAB1の既存のデータに基づいて、各行を TAB2からNC_idsを分割し、挿入/更新したく同じquestion_idとNC_id
  • と重複してはなりません。

この質問では、値を分割しようとするだけでなく、分割してリレーションを維持したまま新しいテーブルに値を割り当てます。これは動的に行う必要があります。

これをどのように達成できますか?上記のためにMySQLでストアドプロシージャを作成しようとしていますが、NC_idsがコンマで連結されているため、解決策が見つかりませんでした。どんな助けも素晴らしいだろう、ありがとう。

+0

ヒント削除:normilizeは、新しいテーブルにカンマ区切りの値で動作いけません。 –

+0

[Mysqlを分割することはできますか?](https://stackoverflow.com/questions/1096679/can-mysql-split-a-column) –

答えて

1

問題を解決するための解決策が見つかりました。

最初に、値の分割が外部キーと共に一時テーブルに格納されるように一時テーブルを作成します。これにより、後でユーザーが結合して新しいテーブルに値を挿入できます。

CREATE TEMPORARY TABLE IF NOT EXISTS `db`.`temp_table` (
    `temp_table_id` INT(5) NOT NULL AUTO_INCREMENT, 
    `tab_question_id` INT(5) NULL, 
    `tab_sector_id` INT(5) NULL, 
    `tab_NC_ids` INT(5) NULL, 
    PRIMARY KEY (`temp_table_id`)); 

上記のコードは一時テーブルを作成し、一時テーブルに基づいて、すべての分割値を一時テーブルに挿入します。

INSERT into db.temp_table (tab_question_id,tab_NC_id) 
    (select tab2_question_id,tab_sector_id,tab2_NC_id, 
    from db.tab1 a, db.tab2 b 
    where b.import_complete = 0 
    and find_in_set(a.tab1_id, replace(b.tab2_NC_ids, ' ', ''))); 

これでデータが分割され、一時テーブルに入力されました。今私は、タブ1テーブルへの結合と挿入データを使用することができます。

INSERT INTO db.tab1(tab1_question_id, tab1_sector_id. tab1_NC_id) 
(Select tNC.tab_question_id, tNC.tab_sector_id, tNC.tab_NC_id 
from db.temp_table tNCO); 

挿入が完了したら、私は一時テーブルに

DROP TABLE temp_table; 
関連する問題