2016-05-06 7 views
0

は、私は、次の表を持っていると言う:キーは整数主キーであり、値がVARCHARであるテーブル内の既存の値に基づくSQLの一括挿入?

TABLE1

--------------------- 
| key | value | 
--------------------- 
--------------------- 
| 0 | val0 | 
--------------------- 
| 1 | val1 | 
--------------------- 
| 2 | blah | 
--------------------- 

今、新しいキーを使用してテーブルの既存の行ごとに重複する行を作成したいとします。新しい各行の値は、既存の行の値と同じになりますが、その前に接頭辞が付いています(CONCATを使用)。しかし、値にサブ文字列valが含まれている場合にのみ、この挿入を実行します。

だから、ファイナルテーブルには、次のようになります。

--------------------- 
| key | value | 
--------------------- 
--------------------- 
| 0 | val0 | 
--------------------- 
| 1 | val1 | 
--------------------- 
| 2 | blah | 
--------------------- 
| 10 | pre_val0 | 
--------------------- 
| 11 | pre_val1 | 
--------------------- 

は、この種のものを行うことができINSERT文を作成する方法はありますか?ここで私が達成しようとしていることのより良い考えを与えるために(動作しない)疑似コードがあります。

insert into table1 (key, value) values (key + 10, CONCAT('pre_', value)) 
where value like '%val%'; 

このようなことを達成する方法はありますか?

+0

これは実際のケースでは、テーブルの列名と値が単純化され、行が少なくなっています。私の実際の事例は同じではあるが、はるかに大きくて長い名前に見えるだろう。 – jros

答えて

0

あなたのタスクは、容易にkeyの衝突を生成する可能性があります。 keyがPKの場合、同じ値を2回挿入しようとするとエラーになります。とにかく:

CREATE TABLE table1(`key` INT PRIMARY KEY, `value` VARCHAR(100)); 

INSERT INTO table1(`key`, `value`) 
SELECT 0,'val0' 
UNION ALL SELECT 1 , 'val1' 
UNION ALL SELECT 2 , 'blah'; 


INSERT INTO table1(`key`, `value`) 
SELECT `key` + 10, CONCAT('pre_', `value`) 
FROM table1 
where `value` like '%val%'; 

SqlFiddleDemo

出力:

╔══════╦══════════╗ 
║ key ║ value ║ 
╠══════╬══════════╣ 
║ 0 ║ val0  ║ 
║ 1 ║ val1  ║ 
║ 2 ║ blah  ║ 
║ 10 ║ pre_val0 ║ 
║ 11 ║ pre_val1 ║ 
╚══════╩══════════╝ 

私はkeyに10を追加する代わりに、AUTOINCREMENTを使用しないことをお勧めします。

関連する問題