MySQL: Làm cách nào để chèn một bản ghi cho mỗi kết quả trong một truy vấn SQL?


84

Giả sử tôi có một lựa chọn

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

trả về một số bản ghi.

Làm cách nào tôi có thể thực hiện chèn cho hàng phạm vi tiếp cận trong tập hợp kết quả như

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

các trường của hàng trong tập kết quả ở đâu @id@customer_idnằm ở đâu?

chỉnh sửa: Tôi không muốn chỉ sao chép nó mà thay vào đó hãy chèn một giá trị mới vào trường domain. Tuy nhiên, một tình huống facepalm rất dễ dàng ;-) Cảm ơn!


Bạn muốn nhân bản các bản ghi bạn đã chọn?
ethrbunny

Tại sao bạn lại chèn các bản ghi của cùng một bảng vào cùng một bảng? Điều này sẽ tạo ra các bản sao
Sachin Shanbhag

Xin lỗi các bạn, câu hỏi này khá ngớ ngẩn, tôi chỉ bị mắc kẹt với một vấn đề rất đơn giản trên facepalm
acme

Mọi người luôn cần một người bạn để trả lời câu hỏi của họ. Vì nỗ lực của bạn, tôi đã trao giải thưởng: [ nerdmeritbadges.com/products/rubberduck]
Jeff Fritz

Tôi có cùng một vấn đề. Ví dụ: cách bảng được thiết kế, tôi cần sao chép các mục nhập người dùng khác nhưng có 356 bản ghi tôi cần sao chép sang người dùng mới.
Casey

Câu trả lời:


160

Đơn giản như sau:

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

Nếu bạn muốn " www.example.com" làm miền, bạn có thể làm:

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

1
Nhưng điều này không chèn một bản ghi mới domainđược đặt thành 'www.example.com', nó chỉ sao chép tất cả các mục nhập.
acme

Bạn nói đúng - nó đơn giản như thế này - một giải pháp đơn giản cho một vấn đề đơn giản facepalm Cảm ơn ;-)
acme

Tôi chỉ định viết ra các phép nối phức tạp để lưu trữ hah này. Cảm ơn rất nhiều! Không thể dễ dàng hơn.
C4d

2
Bạn đã lưu đội ngũ biên tập của tôi vài tuần mindless mẫu thay đồ :-)
Artem Ankudovich

@ArtemAnkudovich vui vì tôi có thể giúp đỡ :)
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
không cần thiết phải thực hiện một truy vấn con như thế này. Kiểm tra các câu trả lời khác
krtek

Krtek: Bạn đang gợi ý câu trả lời nào? Tôi thấy 4 câu trả lời khác và mỗi câu đều sai theo một cách nào đó.
Ken

sai theo cách nào? Ít nhất truy vấn thứ hai của tôi và truy vấn của Jeff Fritz có cùng kết quả như của bạn.
krtek

1
Krtek: Nếu bảng có các bản ghi (1,1, "a", "foo") và (1,1, "b", "foo"), thì truy vấn đầu tiên trong câu hỏi trả về (1,1, "a "), (1,1," b "), như đã hỏi, bản ghi (1,1," example.com ") phải được chèn hai lần. Câu trả lời của bạn khác biệt với chuỗi ký tự "example.com", vì vậy (1,1, "example.com") chỉ được chèn một lần.
Ken

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

Tài liệu MySQL cho cú pháp này ở đây:

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


Cảm ơn, nhưng tôi không muốn sao chép từng trường, 'miền' trường phải khác nhau. Nhưng nó rất đơn giản và tôi chỉ bị mắc kẹt với vấn đề ngu ngốc này.
acme

4

CHỈNH SỬA - Sau khi đọc bình luận về câu trả lời của @ Krtek.

Tôi đoán bạn đang yêu cầu cập nhật thay vì chèn -

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

Thao tác này sẽ cập nhật tất cả các bản ghi hiện có trong bảng cấu hình có tên miền là 'www.example.com' mà không tạo bất kỳ mục nhập trùng lặp nào.

CÂU TRẢ LỜI CŨ -

bạn có thể sử dụng một cái gì đó như -

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

Lưu ý: - Điều này sẽ không hoạt động nếu bạn có id là khóa chính


Cảm ơn, nhưng tôi không muốn sao chép từng trường, 'miền' trường phải khác nhau. Nhưng nó rất đơn giản và tôi chỉ bị mắc kẹt với vấn đề ngu ngốc này.
acme

@acme - Nếu bạn sử dụng chèn, nó chắc chắn sẽ trùng lặp kết quả và nếu bạn đã đánh dấu id của mình là khóa chính, nó thậm chí sẽ không cho phép bạn chèn các hàng.
Sachin Shanbhag

-6

Thực thi câu lệnh SQL này:

-- Do nothing.

Bạn muốn chọn các hàng riêng biệt từ "config" và chèn các hàng giống nhau đó vào cùng một bảng. Họ đã ở trong đó. Không có gì làm.

Trừ khi bạn thực sự chỉ muốn cập nhật một số hoặc tất cả các giá trị trong cột "miền". Điều đó sẽ yêu cầu một tuyên bố CẬP NHẬT thực sự đã làm được điều gì đó.


3
Câu trả lời của tôi rõ ràng là hài hước, và OP thừa nhận có một facepalm. Tôi không xấu hổ về điều đó dù chỉ một chút.
Mike Sherrill 'Cat Recall'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.