2016-05-06 2 views
0

Скажем, у меня есть следующая таблица:Вставка массы SQL на основе существующих значений в таблице?

таблица1

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

Где ключ является целым числом первичного ключа, и значение является VARCHAR.

Теперь я хочу создать повторяющуюся строку для каждой существующей строки в таблице с помощью нового ключа. Значение каждой новой строки будет равно значению существующей строки, но с префиксом перед ней (с использованием CONCAT). Тем не менее, я хочу только запустить эту вставку, если в ней есть подстрока val.

Так финальный стол должен выглядеть следующим образом:

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

Есть ли способ, чтобы создать вставку о том, что может сделать такого рода вещи? Вот какой-то псевдо-код (который не работает), чтобы дать лучшее представление о том, чего я пытаюсь выполнить.

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

Есть ли способ достичь такого рода вещей?

+0

Для всех целей и задач это мой реальный случай с упрощенными именами таблиц столбцов и значениями и меньшим количеством строк. Мой реальный случай будет выглядеть одинаково, но гораздо больше и длиннее. – jros

ответ

0

Ваша задача может легко произвести столкновение key. Если key является PK, тогда вы получаете ошибку при попытке вставить одно и то же значение дважды. В любом случае:

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 ║ 
╚══════╩══════════╝ 

Я предлагаю не добавить от 10 до key но использовать AUTOINCREMENT вместо этого.

Смежные вопросы