MySQL: Wie füge ich einen Datensatz für jedes Ergebnis in eine SQL-Abfrage ein?

84

Angenommen, ich habe eine Auswahl

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

Dies gibt einige Datensätze zurück.

Wie kann ich eine Einfügung für die Erreichbarkeitszeile in der Ergebnismenge wie machen

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

Wo @idund @customer_idsind die Felder der Zeile in der Ergebnismenge?

edit: Ich wollte es nicht nur duplizieren, sondern domainstattdessen einen neuen Wert in das Feld einfügen . Trotzdem eine Facepalm-Situation, da es ganz einfach ist ;-) Danke!

Gipfel
quelle
Sie möchten die ausgewählten Datensätze duplizieren?
Ethrbunny
Warum fügen Sie die Datensätze derselben Tabelle erneut in dieselbe Tabelle ein? Dies wird Duplikate erstellen
Sachin Shanbhag
Sorry Leute, diese Frage war ziemlich dumm, ich hatte nur ein sehr einfaches Problem mit Facepalm
Acme
Jeder braucht einen Kumpel, der ab und zu seine Fragen beantwortet. Für Ihre Bemühungen vergebe
Jeff Fritz
Ich habe das gleiche Problem. Zum Beispiel muss ich bei der Gestaltung der Tabelle die Einträge eines anderen Benutzers replizieren, aber es gibt 356 Datensätze, die ich auf einen neuen Benutzer replizieren muss.
Casey

Antworten:

157

So einfach ist das:

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

Wenn Sie " www.example.com" als Domain möchten , können Sie Folgendes tun:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config;
krtek
quelle
1
Dies fügt jedoch keinen neuen Datensatz mit der domainEinstellung 'www.example.com' ein, sondern dupliziert einfach alle Einträge.
Acme
Sie haben Recht - es ist so einfach wie das - eine einfache Lösung für ein einfaches Problem facepalm Danke ;-)
acme
Ich wollte nur komplizierte Verknüpfungen aufschreiben, um dieses hah zu archivieren. Vielen Dank! Einfacher geht es nicht.
C4d
2
Sie haben die Redaktion von mir einige Wochen des sinnlosen Vorlagenwechsels gerettet :-)
Artem Ankudovich
@ ArtemAnkudovich froh, dass ich helfen konnte :)
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;
Ken
quelle
1
Eine solche Unterabfrage ist nicht erforderlich. Überprüfen Sie die anderen Antworten
krtek
Krtek: Welche Antwort schlagen Sie genau vor? Ich sehe 4 andere Antworten und jede ist irgendwie falsch.
Ken
Inwiefern sind die falsch? Zumindest meine zweite Anfrage und die von Jeff Fritz haben die gleichen Ergebnisse wie Ihre.
krtek
1
Krtek: Wenn die Tabelle Datensätze (1,1, "a", "foo") und (1,1, "b", "foo") enthält, gibt die erste Abfrage in der Frage (1,1, "a) zurück "), (1,1," b "), daher sollte der Datensatz (1,1," example.com ") wie gewünscht zweimal eingefügt werden. Ihre Antwort unterscheidet sich mit dem Zeichenfolgenliteral "example.com", sodass (1,1, "example.com") nur einmal eingefügt wird.
Ken
5
INSERT INTO Config (id, customer_id, domain)
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config

Die MySQL-Dokumentation für diese Syntax finden Sie hier:

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

Jeff Fritz
quelle
Danke, aber ich wollte nicht jedes Feld duplizieren, das Feld 'Domain' sollte anders sein. Aber es ist trotzdem einfach und ich war nur mit diesem dummen Problem festgefahren.
Acme
4

BEARBEITEN - Nach dem Lesen des Kommentars zu @ Krteks Antwort.

Ich denke, Sie bitten um ein Update anstatt einzufügen -

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

Dadurch werden alle vorhandenen Datensätze in der Konfigurationstabelle mit der Domäne "www.example.com" aktualisiert, ohne dass doppelte Einträge erstellt werden.

ALTE ANTWORT -

Sie können so etwas wie -

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

Hinweis: - Dies funktioniert nicht, wenn Sie eine ID als Primärschlüssel haben

Sachin Shanbhag
quelle
Danke, aber ich wollte nicht jedes Feld duplizieren, das Feld 'Domain' sollte anders sein. Aber es ist trotzdem einfach und ich war nur mit diesem dummen Problem festgefahren.
Acme
@acme - Wenn Sie Einfügen verwenden, werden die Ergebnisse sicherlich dupliziert. Wenn Sie Ihre ID als Primärschlüssel markiert haben, können Sie nicht einmal Zeilen einfügen.
Sachin Shanbhag
-6

Führen Sie diese SQL-Anweisung aus:

-- Do nothing.

Sie möchten verschiedene Zeilen aus "config" auswählen und dieselben Zeilen in dieselbe Tabelle einfügen. Sie sind schon da drin. Nichts zu tun.

Es sei denn, Sie möchten tatsächlich nur einige oder alle Werte in der Spalte "Domäne" aktualisieren. Das würde eine UPDATE-Anweisung erfordern, die wirklich etwas bewirkt hat.

Mike Sherrill 'Cat Recall'
quelle
3
Meine Antwort ist eindeutig humorvoll, und das OP gibt eine Gesichtspalme zu. Ich schäme mich nicht einmal ein bisschen dafür.
Mike Sherrill 'Cat Recall'