Câu hỏi Chèn nhiều hàng trong một truy vấn SQL đơn? [bản sao]


Câu hỏi này đã có câu trả lời ở đây:

Tôi có nhiều bộ dữ liệu để chèn cùng một lúc, cho biết 4 hàng.

Bảng của tôi có ba cột: Person, Id và Office.

INSERT INTO MyTable VALUES ("John", 123, "Lloyds Office");
INSERT INTO MyTable VALUES ("Jane", 124, "Lloyds Office");
INSERT INTO MyTable VALUES ("Billy", 125, "London Office");
INSERT INTO MyTable VALUES ("Miranda", 126, "Bristol Office");

Tôi có thể insert tất cả 4 hàng trong một SQL statement?


1340
2018-01-17 05:55


gốc


Ghi chú của người kiểm duyệt: Hãy thảo luận tất cả về giá trị của câu hỏi này bài meta này. - George Stocker♦
Cho oracle sql xem stackoverflow.com/a/93724/1452172 - ono2012
@ Chinggis6 Có, trivially có thể, chỉ cần sử dụng một lựa chọn cho các giá trị cột: - Kzqai
@ Chinggis6 insert into profiles (name, description) select first, 'Auto-generated' from users  Bạn có vẻ bối rối chèn và cập nhật tuyên bố, đó là những con thú khác nhau. - Kzqai
@ Chinggis6 Ah tôi hiểu rồi. Vâng, tôi chỉ khuyên bạn nên sử dụng tiêu chuẩn insert ... select cú pháp, nó sẽ giúp bạn có được mọi thứ bạn cần và linh hoạt như mong muốn. dev.mysql.com/doc/refman/5.5/en/insert.html - Kzqai


Các câu trả lời:


Trong SQL Server 2008, bạn có thể chèn nhiều hàng bằng cách sử dụng một câu lệnh SQL INSERT duy nhất.

INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )

Để tham khảo điều này, hãy xem MOC Course 2778A - Viết các truy vấn SQL trong SQL Server 2008.

Ví dụ:

INSERT INTO MyTable ( Column1, Column2, Column3 )
VALUES ('John', 123, 'Lloyds Office'), 
('Jane', 124, 'Lloyds Office'), 
('Billy', 125, 'London Office'),
('Miranda', 126, 'Bristol Office');

1775
2018-01-17 07:14



Và xin lưu ý rằng số lượng hàng tối đa trong một câu lệnh chèn là 1000. - cryss
Điều đó nên được diễn đạt "số lượng hàng tối đa trong một VALUES mệnh đề là 1000 ". Nó không phải là INSERT tuyên bố được giới hạn trong 1000 hàng. - Anon
Tôi biết câu hỏi này và câu trả lời là cũ, nhưng tôi muốn đề cập đến rằng có một sự khác biệt chức năng giữa việc sử dụng phương pháp được đề cập trong câu hỏi và trong câu trả lời này. Việc thực thi đầu tiên kích hoạt số lần X với 1 bản ghi trong bảng được chèn vào. Thứ hai thực hiện các trigger 1 lần với số lượng bản ghi x trong bảng được chèn vào. Làm cho phương pháp thứ hai là lựa chọn tốt nhất cho hiệu suất giả sử bạn đã kích hoạt của bạn hoạt động chính xác với chèn hàng loạt. - Edwin Stoteler
Điều này không làm việc với SQL Server 2005, xem stackoverflow.com/questions/2624713/… - pkr298
@ahnbizcad Dấu chấm phẩy trong T-sql là KHÔNG bắt buộc, nhưng chúng được báo cáo là bắt buộc trong tương lai. Bạn nên có thói quen sử dụng chúng để chấm dứt từng câu lệnh - mã của bạn sẽ trông đẹp hơn IMO. - NReilingh


Nếu bạn đang chèn vào một bảng duy nhất, bạn có thể viết truy vấn của bạn như thế này (có thể chỉ trong MySQL):

INSERT INTO table1 (First, Last)
VALUES
    ('Fred', 'Smith'),
    ('John', 'Smith'),
    ('Michael', 'Smith'),
    ('Robert', 'Smith');

704
2018-01-17 06:10



Kể từ SQL Server 2008, thao tác này sẽ hoạt động nếu bạn thay thế dấu ngoặc kép bằng dấu ngoặc đơn. - Valentino Vranken
Cũng làm việc với postgres v9.0 - suspectus
Và với SQLite - Michał K
Chỉ có SQLite 3.7.11 trở đi. Nếu bạn không thể đảm bảo điều đó, hãy sử dụng phương thức UNION được hiển thị ở đây: stackoverflow.com/a/5009740/841830 - Darren Cook
Muneem, giới hạn là 1.000 VALUE dòng cho mỗi câu lệnh INSERT. - John Pittaway


CHÚ THÍCH: Câu trả lời này là cho SQL Server 2005. Đối với SQL Server 2008 và sau đó, có nhiều phương pháp tốt hơn như được thấy trong các câu trả lời khác.

Bạn có thể dùng INSERT với SELECT UNION ALL:

INSERT INTO MyTable  (FirstCol, SecondCol)
    SELECT  'First' ,1
    UNION ALL
SELECT  'Second' ,2
    UNION ALL
SELECT  'Third' ,3
...

Chỉ dành cho các tập dữ liệu nhỏ, điều này sẽ tốt cho 4 bản ghi của bạn.


112
2018-01-17 06:16





INSERT báo cáo sử dụng VALUES cú pháp có thể chèn nhiều hàng. Để thực hiện việc này, hãy bao gồm nhiều danh sách giá trị cột, mỗi danh sách được đặt trong dấu ngoặc đơn và được phân tách bằng dấu phẩy.

Thí dụ:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

69
2018-04-01 14:07



Một câu hỏi hay hơn là tại sao bạn muốn? Tại sao không chỉ chạy các lệnh sạch hơn 4 tất cả cùng nhau trong một lô. Nếu một hàng không thành công thì hàng của bạn không thành công. nếu bạn làm chúng riêng lẻ được nhóm lại với nhau thì 3 trong số 4 thành công. - M T Head
@ m-t-head Tôi có một ví dụ về lý do tại sao tôi muốn, và sẽ cung cấp cho bạn 2 lý do. Tôi đang chèn vào một bảng có kích hoạt kiểm tra tính toàn vẹn dữ liệu. Lý do 1 - chèn các giá trị riêng biệt sẽ vi phạm kiểm tra tính toàn vẹn, do đó, quay trở lại giao dịch và trả về lỗi. Tôi đang sử dụng SQL Server mà không hỗ trợ các ràng buộc bị trì hoãn, vì vậy ngay cả khi thay vì kích hoạt nó là một ràng buộc thường xuyên, nó vẫn sẽ không hoạt động. Lý do 2 - kiểm tra tính toàn vẹn là một thủ tục tốn kém và tôi muốn thực hiện nó một lần thay vì 1000 lần mỗi giao dịch. Tôi vẫn đang tìm kiếm giải pháp. - tomosius
bạn có thể tạo một CTE và sử dụng chèn vào YourTable (ID, Tên) Từ ID chọn, Tên Từ CTE - Mohammad Farahani