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'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.