XÁC NHẬN VÀO CHỌN VÀO


127

Sự khác biệt giữa việc sử dụng là gì

SELECT ... INTO MyTable FROM...

INSERT INTO MyTable (...)
SELECT ... FROM ....

?

Từ BOL [ INSERT , SELECT ... INTO ], tôi biết rằng việc sử dụng SELECT ... INTO sẽ tạo ra bảng chèn vào các nhóm tập tin mặc định nếu nó không tồn tại, và rằng khai thác gỗ cho tuyên bố này phụ thuộc vào sự phục hồi mô hình cơ sở dữ liệu.

  1. Phát biểu nào là thích hợp hơn?
  2. Có ý nghĩa hiệu suất khác?
  3. Trường hợp sử dụng tốt cho CHỌN ... VÀO VÀO VÀO VÀO ... là gì?

Chỉnh sửa: Tôi đã tuyên bố rằng tôi biết rằng CHỌN VÀO ... tạo một bảng nơi nó không tồn tại. Điều tôi muốn biết là SQL bao gồm câu lệnh này vì một lý do, nó là gì? Có phải nó đang làm một cái gì đó khác nhau đằng sau hậu trường để chèn các hàng, hoặc nó chỉ là cú pháp đường trên đầu trang CREATE TABLEINSERT INTO.


Một yếu tố nhỏ: INSERT INTOcó hai từ khóa (chọn & vào) ngay trước mặt để cho thế giới biết đây không phải là câu lệnh SQL thông thường, trong khi SELECT ... INTObắt đầu, ít nhất, trông giống như câu lệnh SQL thông thường. Một lý do nhỏ để ủng hộ trước đây.
Martin F

Câu trả lời:


121
  1. Họ làm những việc khác nhau. Sử dụng INSERTkhi bảng tồn tại. Sử dụng SELECT INTOkhi nó không.

  2. Đúng. INSERTkhông có gợi ý bảng thường được ghi lại. SELECT INTOđược ghi lại tối thiểu với giả định cờ theo dõi thích hợp được đặt.

  3. Theo kinh nghiệm của tôi, SELECT INTOthường được sử dụng nhất với các tập dữ liệu trung gian, như #tempbảng hoặc để sao chép toàn bộ bảng như để sao lưu. INSERT INTOđược sử dụng khi bạn chèn vào một bảng hiện có với cấu trúc đã biết.

BIÊN TẬP

Để giải quyết chỉnh sửa của bạn, họ làm những việc khác nhau. Nếu bạn đang tạo một bảng và muốn xác định cấu trúc sử dụng CREATE TABLEINSERT. Ví dụ về một vấn đề có thể được tạo ra: Bạn có một bảng nhỏ với trường varchar. Chuỗi lớn nhất trong bảng của bạn bây giờ là 12 byte. Tập dữ liệu thực của bạn sẽ cần tới 200 byte. Nếu bạn làm SELECT INTOtừ bảng nhỏ của mình để tạo một bảng mới, cái sau INSERTsẽ thất bại với lỗi cắt bớt vì các trường của bạn quá nhỏ.


4
Hai xu của tôi, tôi nghĩ giới thiệu thất bại là một điều tốt. Tôi muốn biết liệu dữ liệu của tôi không khớp với định dạng / kích thước dữ liệu dự kiến ​​của tôi. Tôi luôn cố gắng xác định bảng của mình bằng cách sử dụng CREATE TABLEvà sau đó INSERT INTO, việc kiểm tra SELECTcâu lệnh sẽ dễ dàng hơn mà không cần thực hiện thao tác chèn.
Doug Chamberlain

1
@Doug - Tôi đồng ý. Tôi hầu như chỉ sử dụng SELECT INTOđể tạo một bảng tạm thời hoặc để sao lưu nhanh chóng một bảng hiện có mà tôi sẽ sử dụng.
JNK

1
@JNK - Từ BOL, CHỌN VÀO tạo một bảng có cấu trúc dựa trên các kiểu dữ liệu của các cột trong danh sách chọn. Vì vậy, trong ví dụ của bạn, bạn có thể khắc phục tình huống bằng cách chuyển rõ ràng varchar thành kích thước đủ. Chính xác?
jowenece

2
@Jowenece - vâng tôi mong vậy. Nếu tôi gặp rắc rối đó, tôi sẽ tiếp tục và sử dụng một CREATEtuyên bố mặc dù.
JNK

23
  1. Phát biểu nào là thích hợp hơn? Phụ thuộc vào những gì bạn đang làm.

  2. Có ý nghĩa hiệu suất khác? Nếu bảng là một bảng cố định, bạn có thể tạo các chỉ mục tại thời điểm tạo bảng có ý nghĩa đối với hiệu suất cả tiêu cực và tích cực. Chọn vào không tạo lại các chỉ mục tồn tại trên các bảng hiện tại và do đó việc sử dụng bảng tiếp theo có thể chậm hơn mức cần thiết.

  3. Trường hợp sử dụng tốt cho CHỌN ... VÀO VÀO VÀO VÀO ... là gì? Chọn vào được sử dụng nếu bạn có thể không biết trước cấu trúc bảng. Nó nhanh hơn để viết hơn là tạo bảng và một câu lệnh chèn, vì vậy nó được sử dụng để tăng tốc độ phát hiện nhiều lần. Nó thường nhanh hơn để sử dụng khi bạn đang tạo bảng tạm thời nhanh để kiểm tra mọi thứ hoặc bảng sao lưu của một truy vấn cụ thể (có thể ghi lại những gì bạn sẽ xóa). Rất hiếm khi thấy nó được sử dụng trong mã sản xuất sẽ chạy nhiều lần (ngoại trừ các bảng tạm thời) vì nó sẽ thất bại nếu bảng đã tồn tại.

Nó đôi khi được sử dụng không phù hợp bởi những người không biết những gì họ đang làm. Và kết quả là chúng có thể gây ra sự tàn phá trong db. Tôi thực sự cảm thấy không phù hợp khi sử dụng CHỌN VÀO cho bất kỳ thứ gì ngoài bảng vứt đi (bản sao lưu tạm thời, bảng tạm thời sẽ biến mất ở cuối phần lưu trữ, v.v.). Các bảng cố định cần có suy nghĩ thực sự về thiết kế của chúng và CHỌN VÀO giúp bạn dễ dàng tránh suy nghĩ về bất cứ điều gì ngay cả cơ bản như cột nào và kiểu dữ liệu nào.

Nói chung, tôi thích sử dụng bảng tạo và câu lệnh chèn - bạn có nhiều điều khiển hơn và tốt hơn cho các quy trình lặp lại. Hơn nữa, nếu bảng là một bảng cố định, thì nó phải được tạo từ một tập lệnh tạo bảng riêng biệt (một trong đó là trong điều khiển nguồn) vì nói chung, việc tạo các đối tượng vĩnh viễn không nên chèn / xóa / cập nhật hoặc chọn từ một bàn. Các thay đổi đối tượng nên được xử lý tách biệt với các thay đổi dữ liệu vì các đối tượng có ý nghĩa vượt quá nhu cầu của một thao tác chèn / cập nhật / chọn / xóa cụ thể. Bạn cần xem xét các loại dữ liệu tốt nhất, suy nghĩ về các ràng buộc FK, PK và các ràng buộc khác, xem xét các yêu cầu kiểm toán, suy nghĩ về lập chỉ mục, v.v.


5

Sự khác biệt chính là CHỌN VÀO MyTable sẽ tạo một bảng mới gọi là MyTable với các kết quả, trong khi INSERT INTO yêu cầu MyTable đã tồn tại.

Bạn sẽ chỉ sử dụng CHỌN VÀO trong trường hợp bảng không tồn tại và bạn muốn tạo bảng dựa trên kết quả truy vấn của mình. Như vậy, hai tuyên bố này thực sự không thể so sánh được. Họ làm những việc rất khác nhau.

Nói chung, SELECT INTO được sử dụng thường xuyên hơn cho một tác vụ tắt, trong khi INSERT INTO được sử dụng thường xuyên để thêm hàng vào bảng.

CHỈNH SỬA:
Mặc dù bạn có thể sử dụng CREATE TABLE và INSERT INTO để thực hiện những gì CHỌN VÀO, nhưng với CHỌN VÀO, bạn không cần phải biết định nghĩa bảng trước. CHỌN INTO có thể được bao gồm trong SQL vì nó làm cho các tác vụ như báo cáo đột xuất hoặc sao chép bảng dễ dàng hơn nhiều.


TẠO BẢNG và CHỌN VÀO khá giống nhau (tôi không cần CHỌN VÀO như một sự bổ sung để hoàn thành những gì CHỌN VÀO làm) và tôi nghĩ không nên chọn CHỌN VÀO. Xem dba.stackexchange.com/questions/156105/ .
Rick

4

Mỗi câu lệnh có một trường hợp sử dụng riêng biệt. Chúng không thể thay thế cho nhau.

SELECT...INTO MyTable...tạo ra một cái mới MyTablemà trước đây người ta không tồn tại.

INSERT INTO MyTable...SELECT...được sử dụng khi MyTableđã tồn tại.


4
Bạn đã không trả lời bất kỳ câu hỏi của tôi và tôi đã nêu câu trả lời của bạn.
jowenece

5
Các câu trả lời cho câu hỏi của bạn được ngụ ý. Để làm cho nó rõ ràng hơn, không có câu lệnh "thích hợp hơn" vì mỗi câu có một trường hợp sử dụng riêng biệt. Các tuyên bố không thể thay thế cho nhau. Sử dụng phiên bản đầu tiên khi bạn muốn tạo một bảng mới không tồn tại. Sử dụng phiên bản thứ hai khi bảng đã tồn tại.
Joe Stefanelli

2
Tại sao tôi muốn làm điều đó với việc tạo một bảng tạm thời và sau đó chèn vào nó? Có một lợi thế?
jowenece

4

Trên thực tế CHỌN ... INTO không chỉ tạo bảng mà sẽ thất bại nếu nó đã tồn tại, vì vậy về cơ bản, lần duy nhất bạn sẽ sử dụng nó là khi bảng bạn đang chèn không tồn tại.

Liên quan đến EDIT của bạn:

Cá nhân tôi chủ yếu sử dụng CHỌN ... VÀO khi tôi đang tạo bảng tạm thời. Điều đó với tôi là sử dụng chính. Tuy nhiên tôi cũng sử dụng nó khi tạo các bảng mới với nhiều cột có cấu trúc tương tự các bảng khác và sau đó chỉnh sửa nó để tiết kiệm thời gian.


1
Tôi chủ yếu nhìn thấy việc sử dụng SELECT..INTO cho các bảng tạm thời, nhưng có lý do nào để thích điều đó hơn là tạo bảng tạm thời với câu lệnh CREATE TABLE không? Ví dụ - hiệu suất đạt được?
jowenece

3
@jowenece Tôi nghĩ chủ yếu vì đơn giản ... Cũng có thể nói bạn có một truy vấn động. Tôi không biết cấu trúc, bạn không thể tạo bảng trước khi sử dụng và việc sử dụng CHỌN ... VÀO dễ dàng hơn nhiều so với tạo bảng một cách ngẫu nhiên.
AJC

3

CHỌN INTO thường được sử dụng để tạo các bảng tạm thời hoặc sao chép một bảng khác (dữ liệu và / hoặc cấu trúc).

Trong mã ngày này bạn sử dụng INSERT vì các bảng của bạn đã tồn tại để được đọc, UPDATEd, DELETEd, THAM GIA, vv Lưu ý: từ khóa INTO là tùy chọn với INSERT

Đó là, các ứng dụng thường không tạo và thả các bảng như một phần của hoạt động bình thường trừ khi đó là bảng tạm thời cho một số phạm vi sử dụng cụ thể và giới hạn.

Một bảng được tạo bởi SELECT INTO sẽ không có khóa hoặc chỉ mục hoặc ràng buộc nào không giống như một bảng thực sự, đã tồn tại, đã tồn tại

Cả 2 không thể so sánh trực tiếp vì chúng hầu như không có sự trùng lặp trong cách sử dụng


2

Tôi chỉ muốn đề cập đến điểm thứ hai của câu hỏi liên quan đến hiệu suất, bởi vì không có cơ quan nào khác đưa ra điều này. Chọn Into nhanh hơn rất nhiều so với chèn vào, khi nói đến các bảng có bộ dữ liệu lớn. Tôi thích chọn vào khi tôi phải đọc một bảng rất lớn. chèn vào một bảng có 10 triệu hàng có thể mất hàng giờ trong khi chọn vào sẽ thực hiện việc này trong vài phút và vì liên quan đến việc mất chỉ mục trên bảng mới, bạn có thể tạo lại các chỉ mục bằng truy vấn và vẫn có thể tiết kiệm nhiều thời gian hơn khi so sánh với chèn vào.


Điều đó đúng, nhưng điều đó chủ yếu là do SQL Server biết rằng không có sự tranh chấp nào cho bảng đích. Hiệu suất cho insert into #temp with(tablock) select * from ..gần giống như hiệu suất choselect * into #temp from ...
Brian

1

Chọn vào tạo bảng mới cho bạn tại thời điểm đó và sau đó chèn các bản ghi trong bảng từ bảng nguồn. Bảng mới được tạo có cấu trúc tương tự như bảng nguồn. Nếu bạn cố gắng sử dụng chọn vào một bảng hiện có, nó sẽ tạo ra lỗi, bởi vì nó sẽ cố gắng tạo bảng mới có cùng tên. Chèn vào yêu cầu bảng tồn tại trong cơ sở dữ liệu của bạn trước khi bạn chèn các hàng trong đó.


1

Sự khác biệt đơn giản giữa chọn vào và Chèn vào là: -> Chọn vào không cần bảng hiện có. Nếu bạn muốn sao chép dữ liệu bảng A, bạn chỉ cần gõ Chọn * INTO [tablename] từ A. Tại đây, tablename có thể là bảng hiện có hoặc bảng mới sẽ được tạo có cùng cấu trúc như bảng A.

-> Chèn vào cần có bảng hiện có.INERT INTO [tablename] CHỌN * TỪ A;. Ở đây tablename là một bảng hiện có.

Chọn Into thường phổ biến hơn để sao chép dữ liệu, đặc biệt là dữ liệu sao lưu.

Bạn có thể sử dụng theo yêu cầu của bạn, đó hoàn toàn là sự lựa chọn của nhà phát triển nên được sử dụng trong kịch bản của anh ấy.

Hiệu suất khôn ngoan Chèn INTO là nhanh chóng.

Người giới thiệu :

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp


-2

Chọn vào các bộ dữ liệu lớn có thể chỉ tốt cho một người dùng sử dụng một kết nối duy nhất đến cơ sở dữ liệu thực hiện một tác vụ vận hành hàng loạt. Tôi không khuyên bạn nên sử dụng

SELECT * INTO table

vì điều này tạo ra một giao dịch lớn và tạo khóa lược đồ để tạo đối tượng, ngăn người dùng khác tạo đối tượng hoặc truy cập các đối tượng hệ thống cho đến khi SELECT INTOhoàn thành thao tác.

Bằng chứng về khái niệm mở 2 phiên, trong phiên đầu tiên hãy thử sử dụng

select into temp table from a huge table 

và trong phần thứ hai hãy cố gắng

create a temp table 

và kiểm tra các khóa, chặn và thời lượng của phiên thứ hai để tạo một đối tượng bảng tạm thời. Tôi khuyên bạn luôn luôn nên tạo và chèn câu lệnh và nếu cần để ghi nhật ký tối thiểu, hãy sử dụng cờ theo dõi 610.

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.