MySQL: как вставить запись для каждого результата в запросе SQL? - PullRequest
74 голосов
/ 09 марта 2011

Скажите, у меня есть выбор

SELECT DISTINCT id, customer_id, domain FROM config WHERE type = 'foo';

, который возвращает несколько записей.

Как сделать вставку для расширенной строки в наборе результатов, например

INSERT INTO config (id, customer_id, domain) VALUES (@id, @customer_id, 'www.example.com');

, где @id и @customer_id - поля строки в наборе результатов?

edit: я не хотел просто дублировать его, но вместо этого вставил новое значение в поле domain. Тем не менее, ситуация с лицевой панелью проста ;-) Спасибо!

Ответы [ 5 ]

141 голосов
/ 09 марта 2011

Столь же просто, как это:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, domain FROM config;

Если вы хотите "www.example.com" в качестве домена, вы можете сделать:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config;
7 голосов
/ 09 марта 2011
INSERT INTO config (id, customer_id, domain)
SELECT id, customer_id, 'www.example.com' FROM (
  SELECT DISTINCT id, customer_id, domain FROM config
  WHERE type = 'foo'
) x;
5 голосов
/ 09 марта 2011
INSERT INTO Config (id, customer_id, domain)
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config

Документация MySQL для этого синтаксиса находится здесь:

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

3 голосов
/ 09 марта 2011

РЕДАКТИРОВАТЬ - Прочитав комментарий к ответу @ Krtek.

Я полагаю, вы запрашиваете обновление вместо вставки -

update config set domain = 'www.example.com'

Это обновит все существующие записи в таблице конфигурации с доменом как «www.example.com» без создания дублирующихся записей.

СТАРЫЙ ОТВЕТ -

Вы можете использовать что-то вроде -

INSERT INTO config (id, customer_id, domain)
select id, customer_id, domain FROM config

Примечание: - Это не будет работать, если у вас есть идентификатор в качестве первичного ключа

0 голосов
/ 09 марта 2011

Выполните этот оператор SQL:

-- Do nothing.

Вы хотите выбрать отдельные строки из «config» и вставить эти же строки в одну таблицу.Они уже там.Ничего не поделаешь.

Если вы просто не хотите обновить некоторые или все значения в столбце "домен".Это потребовало бы оператора UPDATE, который действительно что-то сделал.

...