Chèn nhiều hàng vào một truy vấn SQL đơn lẻ?


1,212

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, IdOffice.

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ể chèn tất cả 4 hàng trong một câu lệnh SQL không?

+3

** Moderator Lưu ý **: Xin vui lòng dành tất cả cuộc thảo luận về những giá trị của câu hỏi này với [bài meta này] (http://meta.stackexchange.com/questions/ 194313/tại sao-chèn-nhiều-hàng-trong-một-sql-truy vấn-đóng). 22 aug. 132013-08-22 13:39:20

+2

Cho oracle sql xem http://stackoverflow.com/a/93724/1452172 26 jun. 142014-06-26 11:20:34

  0

sử dụng add.batch dude 18 sep. 142014-09-18 09:57:27

  0

Để chèn nhiều bản ghi trong một dòng, bạn có thể thử ví dụ này: chèn vào tablename (col1, col2) chọn uid, uname từ usertable; 04 mar. 152015-03-04 12:35:27

  0

bạn cũng có thể sử dụng truy vấn này để chèn nhiều hàng trong một truy vấn SQL đơn. đây là truy vấn: INSERT vào tablename1 (Person, Id, Office) SELECT 'John', 1, 'Lloyds Office' UNION SELECT 'Jane', 2, 'Văn phòng Lloyd' UNION SELECT 'Billy', 3, 'Lloyds Office' UNION SELECT 'Miranda', 4, 'Lloyds Office' 19 oct. 162016-10-19 06:02:31

  0

Theo như tôi có thể nói, tên của kỹ thuật này không có gì cụ thể, chỉ cần 'chèn nhiều hàng', cho những người muốn có thể tham khảo kỹ thuật theo khái niệm. Tham khảo: https://dev.mysql.com/doc/refman/5.5/en/insert.html 28 dec. 162016-12-28 22:45:23

  0

@Kzqai, còn 'insert set col1 = 'val1', col2 = 'val2 (?) Col1 =' val3 ' , col2 = val2'' trong/cho [tag: mysql]? Tôi có nghĩa là chèn nhiều hàng với cú pháp 'insert set' cụ thể mysql; là nó có thể? 10 sep. 172017-09-10 11:27:04

+1

@ Chinggis6 Có, tầm thường có thể, chỉ cần sử dụng một lựa chọn cho các giá trị cột: 11 sep. 172017-09-11 17:24:43

  0

@Kzqai bạn có thể cung cấp một ví dụ xin vui lòng? 11 sep. 172017-09-11 18:18:46

+1

@ Chinggis6 '' 'chèn vào hồ sơ (tên, mô tả) chọn đầu tiên, 'Tự động tạo ra' từ người dùng''' Bạn dường như khó hiểu chèn và cập nhật tuyên bố, đó là những con thú khác nhau. 11 sep. 172017-09-11 21:21:31

  0

@Kzqai No. Vui lòng kiểm tra lại liên kết bạn đã cung cấp ở trên. MySQL, không giống như các DB khác, cho phép bạn sử dụng 'insert' trong' update' thời trang với từ khóa 'set' thay vì' các giá trị'. Nó là một câu lệnh SQL không chuẩn SQL cụ thể. 11 sep. 172017-09-11 21:26:00

+1

@ 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 '' 'chèn ...cú pháp select''', nó sẽ giúp bạn có được mọi thứ bạn cần và linh hoạt như mong muốn. https://dev.mysql.com/doc/refman/5.5/en/insert.html 12 sep. 172017-09-12 13:43:14

641

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

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

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. 22 mar. 122012-03-22 13:37:41

+6

Cũng hoạt động với postgres v9.0 13 nov. 132013-11-13 10:19:24

+7

Và với SQLite 09 dec. 132013-12-09 10:13:07

+4

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 pháp UNION được hiển thị ở đây: http://stackoverflow.com/a/5009740/841830 13 feb. 142014-02-13 01:12:58

  0

có giới hạn về giá trị không? như thể tôi có nhiều hồ sơ thì làm thế nào để đối phó với tình huống này? 28 sep. 152015-09-28 07:32:37

  0

Không hoạt động trong MS SQL DataWarehouse 25 oct. 162016-10-25 03:58:44

  0

Nó hoạt động trong SQL Server 2012 tốt. 22 feb. 182018-02-22 17:52:21

  0

Muneem, giới hạn là 1.000 VALUE dòng trên mỗi câu lệnh INSERT. 22 feb. 182018-02-22 18:02:45


105

LƯU Ý: câu trả lời này là dành 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ể sử dụng INSERT with 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ỏ mặc dù, mà nên sử dụng tốt cho 4 hồ sơ của bạn.


1,618

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

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

Để tham khảo này có một cái nhìn tại MOC Khóa học 2778A - Viết câu truy vấn SQL trong SQL Server 2008.

+259

Và xin lưu ý rằng số hàng tối đa trong một câu lệnh chèn là 1000. 21 mar. 132013-03-21 13:39:29

+129

Điều đó cần được diễn đạt "số lượng hàng tối đa trong một mệnh đề' VALUES' là 1000 ". Nó không phải là câu lệnh 'INSERT' được giới hạn trong 1000 hàng. 19 dec. 132013-12-19 17:58:48

  0

@Anon Cảm ơn bạn đã xóa sạch nhận xét rất sai lệch của ChrisJ. Lưu tôi từ một số gỡ lỗi đau đớn. :) 11 mar. 142014-03-11 13:33:14

+17

Tôi biết câu hỏi và câu trả lời này là cũ, nhưng tôi muốn đề cập 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. 24 apr. 142014-04-24 12:07:40

+7

Điều này không hoạt động với SQL Server 2005, xem http://stackoverflow.com/questions/2624713/how-do-i-insert-multiple-rows-without-repeating-the-insert-into-dbo-blah- phần 28 apr. 142014-04-28 16:40:54

+1

bạn không có dấu chấm phẩy ở cuối câu lệnh, trong khi các câu trả lời khác thì có. bạn có cần hay không? 07 dec. 152015-12-07 18:51:25

+4

@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. 09 dec. 152015-12-09 03:51:21

+1

@NReilingh Tôi hoàn toàn không nhận thức được điều đó. Tôi thực sự đã tiến hành tra cứu nó. Để tham khảo, đây là một liên kết đến [quy ước cú pháp t-sql trong thư viện microsoft] (https://msdn.microsoft.com/en-us/library/ms177563.aspx). Tôi cũng thêm một liên kết đến [một bài viết thú vị về chủ đề] (http://www.dbdelta.com/always-use-semicolon-statement-terminators/). Cảm ơn ! 12 dec. 152015-12-12 17:54:24

  0

Điều này cũng chậm hơn so với những gì anh ta hiện đang làm: http://stackoverflow.com/questions/8635818/multiple-insert-statements-vs-single-insert-with-multiple-values ​​ 08 aug. 162016-08-08 23:24:49

  0

@Anon Nếu bạn cần nhiều hơn 1000 các hàng bạn có thể kết hợp nhiều nhà thầu 'VALUES' 1000 hàng trong một CTE cho chèn của bạn. Vẫn được tính là một truy vấn! 09 mar. 172017-03-09 20:04:08

  0

bạn có biết trong đó đặc tả sql đã được giới thiệu không? (nhiều giá trị) 27 jul. 172017-07-27 08:50:41

  0

Số hàng tối đa là 1000, NHƯNG số tối ưu là bất kỳ thứ gì trong khoảng từ 10 đến 100 (tùy thuộc vào số cột). Đọc [bài viết này] (https://www.red-gate.com/simple-talk/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load- phương pháp /) 20 nov. 172017-11-20 17:40:18


65

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 bao trong dấu ngoặc đơn và được phân tách bằng dấu phẩy.

Ví dụ:

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

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. 07 sep. 162016-09-07 16:41:10

+3

@ 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. 21 jan. 172017-01-21 06:36:38

  0

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 25 jul. 172017-07-25 05:15:50