MySQL: Jak wstawić rekord dla każdego wyniku w zapytaniu SQL?


84

Powiedz, że mam wybór

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

która zwraca niektóre rekordy.

Jak mogę wstawić wiersz zasięgu w zestawie wyników, np

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

gdzie @idi @customer_idsą pola wiersza w zestawie wyników?

edycja: nie chciałem go po prostu powielać, ale domainzamiast tego wstawić nową wartość w polu . Niemniej jednak sytuacja na twarzy, ponieważ jest to po prostu łatwe ;-) Dzięki!


Chcesz powielić wybrane rekordy?
ethrbunny

Dlaczego ponownie wstawiasz rekordy z tej samej tabeli do tej samej tabeli? Spowoduje to utworzenie duplikatów
Sachin Shanbhag

Przepraszam chłopaki, to pytanie było dość głupie, utknąłem z bardzo prostym problemem facepalm
acme

Każdy potrzebuje kumpla, który od czasu do czasu będzie odpowiadał na jego pytania. Za twój wysiłek nagradzam: [ nerdmeritbadges.com/products/rubberduck]
Jeff Fritz

Mam ten sam problem. Na przykład ze względu na sposób zaprojektowania tabeli muszę replikować wpisy innych użytkowników, ale istnieje 356 rekordów, które muszę zreplikować dla nowego użytkownika.
Casey

Odpowiedzi:


161

Tak proste, jak to:

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

Jeśli chcesz, aby www.example.comdomena „ ” była domeną, możesz:

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

1
Ale to nie powoduje wstawienia nowego rekordu z domainustawieniem „www.example.com”, po prostu powiela wszystkie wpisy.
acme

Masz rację - to takie proste - proste rozwiązanie prostego problemu facepalm Dzięki ;-)
acme

Chciałem tylko zapisać skomplikowane łączenia, aby zarchiwizować to hah. Wielkie dzięki! Nie może być łatwiejsze.
C4d

2
Zaoszczędziłeś mojemu zespołowi redakcyjnemu kilka tygodni bezmyślnej zmiany szablonu :-)
Artem Ankudovich

@ArtemAnkudovich cieszę się, że mogłem być pomocny :)
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
nie ma potrzeby wykonywania takiego podzapytania. Sprawdź pozostałe odpowiedzi
krtek

Krtek: Którą odpowiedź dokładnie sugerujesz? Widzę 4 inne odpowiedzi i każda jest w jakiś sposób błędna.
Ken

w jaki sposób są złe? Przynajmniej moje drugie zapytanie i to od Jeffa Fritza dają takie same wyniki jak twoje.
krtek

1
Krtek: Jeśli tabela zawiera rekordy (1,1, "a", "foo") i (1,1, "b", "foo"), to pierwsze zapytanie w pytaniu zwraca (1,1, "a „), (1,1,„ b ”), więc zgodnie z pytaniem rekord (1,1,„ example.com ”) należy wstawić dwukrotnie. Twoja odpowiedź różni się od literału ciągu „example.com”, więc (1,1, „example.com”) jest wstawiane tylko raz.
Ken

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

Dokumentacja MySQL dotycząca tej składni znajduje się tutaj:

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


Dzięki, ale nie chciałem powielać każdego pola, pole „domain” powinno być inne. Ale mimo wszystko jest to proste i po prostu utknąłem z tym głupim problemem.
acme

4

EDYCJA - Po przeczytaniu komentarza do odpowiedzi @ Krtek.

Chyba prosisz o aktualizację zamiast wstawiania -

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

Spowoduje to zaktualizowanie wszystkich istniejących rekordów w tabeli konfiguracji o domenę „www.example.com” bez tworzenia zduplikowanych wpisów.

STARA ODPOWIEDŹ -

możesz użyć czegoś takiego jak -

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

Uwaga: - To nie zadziała, jeśli masz identyfikator jako klucz podstawowy


Dzięki, ale nie chciałem powielać każdego pola, pole „domain” powinno być inne. Ale mimo wszystko jest to proste i po prostu utknąłem z tym głupim problemem.
acme

@acme - Jeśli użyjesz wstawiania, na pewno zduplikuje wyniki, a jeśli oznaczyłeś swój identyfikator jako klucz podstawowy, nie pozwoli ci nawet wstawić wierszy.
Sachin Shanbhag

-6

Wykonaj tę instrukcję SQL:

-- Do nothing.

Chcesz wybrać różne wiersze z „config” i wstawić te same wiersze do tej samej tabeli. Już tam są. Nic do roboty.

Chyba że chcesz tylko zaktualizować niektóre lub wszystkie wartości w kolumnie „domain”. To wymagałoby instrukcji UPDATE, która naprawdę coś zrobiła.


3
Moja odpowiedź jest wyraźnie zabawna, a OP przyznaje się do facepalmów. Nie wstydzę się tego ani trochę.
Mike Sherrill `` Cat Recall ''
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.