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поля поля в рядку в наборі результатів?

редагувати: я не хотів просто дублювати його, а domainнатомість вставити нове значення в поле . Тим не менше, ситуація з facepalm, оскільки це дуже просто ;-) Дякую!


Ви хочете продублювати вибрані вами записи?
ethrbunny

Чому ви знову вставляєте записи тієї самої таблиці в одну таблицю? Це створить дублікати
Sachin Shanbhag

Вибачте, хлопці, це питання було досить дурним, у мене просто застрягла дуже проста проблема facepalm
acme

Кожному потрібен приятель, щоб час від часу відповідати на його запитання. За ваші зусилля я нагороджую: [ nerdmeritbadges.com/products/rubberduck]
Джефф Фріц,

У мене таке ж питання. Наприклад, як оформлено таблицю, мені потрібно відтворити записи інших користувачів, але є 356 записів, які мені потрібно відтворити новому користувачеві.
Кейсі

Відповіді:


160

Так просто, як це:

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", він просто дублює всі записи.
акме

Ви маєте рацію - це так просто - це просте рішення простої проблеми 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
немає необхідності робити такий підзапит. Перевірте інші відповіді
кртек

Кртек: Яку саме відповідь ви пропонуєте? Я бачу 4 інші відповіді, і кожна з них є якоюсь помилкою.
Кен

в який спосіб помиляються? Принаймні мій другий запит та запит Джеффа Фріца мають ті самі результати, що й ваш.
krtek

1
Кртек: Якщо в таблиці є записи (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

EDIT - Прочитавши коментар до відповіді @ 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 - Якщо ви використовуєте вставку, це, безумовно, продублює результати, і якщо ви позначили свій ідентифікатор як первинний ключ, це навіть не дозволить вам вставити рядки.
Sachin Shanbhag

-6

Виконайте цей оператор SQL:

-- Do nothing.

Ви хочете вибрати різні рядки з "config" і вставити ці самі рядки в одну таблицю. Вони вже там. Нічого робити.

Якщо ви насправді не хочете просто оновити деякі або всі значення в стовпці "домен". Для цього знадобиться оператор UPDATE, який дійсно щось зробив.


3
Моя відповідь є явно жартівливою, і ОП визнає facepalm. Мені цього навіть трохи не соромно.
Mike Sherrill 'Cat Recall'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.