MySQL: как вставить запись для каждого результата в SQL-запрос?

84

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

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вместо этого вставил новое значение в поле . Тем не менее, фейспалм-ситуация простая ;-) Спасибо!

акме
источник
Вы хотите продублировать выбранные вами записи?
ethrbunny 09
Почему вы снова вставляете записи той же таблицы в ту же таблицу? Это создаст дубликаты
Сачин Шанбхаг
Извините, ребята, этот вопрос был довольно глупым, я просто застрял с очень простой проблемой facepalm
acme
Каждому нужен приятель, чтобы время от времени отвечать на его вопросы. За ваши усилия я награждаю: [ nerdmeritbadges.com/products/rubberduck]
Джефф Фриц
У меня такая же проблема. Например, из-за того, что таблица спроектирована, мне нужно реплицировать записи других пользователей, но есть 356 записей, которые мне нужно реплицировать новому пользователю.
Кейси

Ответы:

162

Вот так просто:

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;
кртек
источник
1
Но при этом не вставляется новая запись со domainзначением «www.example.com», а просто дублируются все записи.
acme
Вы правы - это так просто - простое решение простой проблемы facepalm Спасибо ;-)
acme
Я просто собирался записать сложные объединения, чтобы заархивировать это, ха. Большое спасибо! Не может быть проще.
C4d
2
Вы спасли мою редакцию на несколько недель бездумной смены шаблонов :-)
Артем Анкудович
@ArtemAnkudovich рад, что смог помочь :)
krtek
7
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;
Кен
источник
1
в таком подзапросе нет необходимости. Проверьте другие ответы
krtek
Кртек: Какой именно ответ вы предлагаете? Я вижу еще 4 ответа, и каждый в чем-то неверен.
Кен
в чем неправильные? По крайней мере, мой второй запрос и запрос Джеффа Фрица дают те же результаты, что и ваш.
krtek
1
Krtek: Если в таблице есть записи (1,1, «a», «foo») и (1,1, «b», «foo»), то первый запрос в вопросе возвращает (1,1, «a "), (1,1," b "), поэтому запись (1,1," example.com ") должна быть вставлена ​​дважды. Ваш ответ отличается от строкового литерала "example.com", поэтому (1,1, "example.com") вставляется только один раз.
Кен
5
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

Джефф Фриц
источник
Спасибо, но я не хотел дублировать каждое поле, поле «домен» должно быть другим. Но все же это просто, и я просто застрял с этой глупой проблемой.
acme
4

РЕДАКТИРОВАТЬ - После прочтения комментария к ответу @ 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

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

Сачин Шанбхаг
источник
Спасибо, но я не хотел дублировать каждое поле, поле «домен» должно быть другим. Но все же это просто, и я просто застрял с этой глупой проблемой.
acme
@acme - если вы используете insert, он обязательно дублирует результаты, и если вы отметили свой идентификатор как первичный ключ, он даже не позволит вам вставлять строки.
Sachin Shanbhag
-6

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

-- Do nothing.

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

Если вы на самом деле не хотите просто обновить некоторые или все значения в столбце «домен». Для этого потребуется инструкция UPDATE, которая действительно что-то делает.

Майк Шерилл, "Отзыв кошки"
источник
3
Мой ответ явно юмористический, и ОП признает фейспалм. Я ни капли не стыжусь этого.
Майк Шерилл 'Cat Recall'