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.