MySQL: come inserire un record per ogni risultato in una query SQL?


84

Di 'che ho una selezione

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

che restituisce alcuni record.

Come posso fare un inserto per la riga di copertura nel set di risultati come

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

dove @ide @customer_idsono i campi della riga nel set di risultati?

modifica: non volevo semplicemente duplicarlo, ma inserire invece un nuovo valore nel campo domain. Tuttavia una situazione di facepalm come è semplice facile ;-) Grazie!


Vuoi duplicare i record che hai selezionato?
ethrbunny

Perché stai inserendo di nuovo i record della stessa tabella nella stessa tabella? Questo creerà dei duplicati
Sachin Shanbhag

Scusate ragazzi, questa domanda era piuttosto stupida, ero solo bloccato con un problema molto semplice facepalm
acme

Tutti hanno bisogno di un amico che risponda alle loro domande ogni tanto. Per il tuo impegno premio: [ nerdmeritbadges.com/products/rubberduck]
Jeff Fritz

Ho lo stesso problema. Ad esempio, il modo in cui è progettata la tabella, ho bisogno di replicare le voci di un altro utente ma ci sono 356 record che devo replicare a un nuovo utente.
Casey

Risposte:


162

Semplice come questo:

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

Se vuoi " www.example.com" come dominio, puoi fare:

INSERT INTO config (id, customer_id, domain) 
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config;

1
Ma questo non inserisce un nuovo record con domainimpostato su "www.example.com", duplica semplicemente tutte le voci.
acme

Hai ragione - è così semplice - una semplice soluzione a un semplice problema facepalm Grazie ;-)
acme

Stavo solo per scrivere join complicati per archiviare questo hah. Molte grazie! Non potrebbe essere più facile.
C4d

2
Hai risparmiato alla mia redazione alcune settimane di
inutili

@ArtemAnkudovich sono contento di aver potuto essere di aiuto :)
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
non è necessario eseguire una sottoquery come questa. Controlla le altre risposte
krtek

Krtek: Quale risposta stai suggerendo esattamente? Vedo altre 4 risposte e ognuna è sbagliata in qualche modo.
Ken

in che modo sono sbagliati? Almeno la mia seconda query e quella di Jeff Fritz hanno gli stessi risultati della tua.
krtek

1
Krtek: se la tabella ha record (1,1, "a", "foo") e (1,1, "b", "foo"), la prima query nella domanda restituisce (1,1, "a "), (1,1," b "), quindi, come richiesto, il record (1,1," esempio.com ") deve essere inserito due volte. La tua risposta fa una distinzione con la stringa letterale "esempio.com", quindi (1,1, "esempio.com") viene inserita solo una volta.
Ken

5
INSERT INTO Config (id, customer_id, domain)
SELECT DISTINCT id, customer_id, 'www.example.com' FROM config

La documentazione di MySQL per questa sintassi è qui:

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


Grazie, ma non volevo duplicare ogni campo, il campo "dominio" dovrebbe essere diverso. Ma è comunque semplice ed ero bloccato con questo stupido problema.
acme

4

EDIT - Dopo aver letto il commento sulla risposta di @ Krtek.

Immagino tu stia chiedendo un aggiornamento invece di inserire -

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

Questo aggiornerà tutti i record esistenti nella tabella di configurazione con dominio come "www.example.com" senza creare voci duplicate.

VECCHIA RISPOSTA -

puoi usare qualcosa come -

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

Nota: - Questo non funzionerà se hai id come chiave primaria


Grazie, ma non volevo duplicare ogni campo, il campo "dominio" dovrebbe essere diverso. Ma è comunque semplice ed ero solo bloccato con questo stupido problema.
acme

@acme - Se usi insert, duplicherà sicuramente i risultati e se hai contrassegnato il tuo id come chiave primaria, non ti permetterà nemmeno di inserire righe.
Sachin Shanbhag

-6

Esegui questa istruzione SQL:

-- Do nothing.

Vuoi selezionare righe distinte da "config" e inserire quelle stesse righe nella stessa tabella. Sono già lì. Niente da fare.

A meno che tu non voglia aggiornare solo alcuni o tutti i valori nella colonna "dominio". Ciò richiederebbe un'istruzione UPDATE che abbia davvero fatto qualcosa.


3
La mia risposta è chiaramente divertente e l'OP ammette un facepalm. Non me ne vergogno nemmeno un po '.
Mike Sherrill 'Cat Recall'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.