Đầu ra MySQL được chèn

Khi bạn chèn, cập nhật hoặc xóa các bản ghi khỏi một bảng, SQL Server sẽ theo dõi các bản ghi được thay đổi trong hai bảng giả khác nhau. ĐƯỢC CHÈN và ĐÃ XÓA. Các bảng này thường được sử dụng trong trình kích hoạt DML. Nếu bạn sử dụng mệnh đề OUTPUT trên một câu lệnh INSERT, UPDATE, DELETE hoặc MERGE, bạn có thể hiển thị các bản ghi đi tới các bảng giả này cho ứng dụng và/hoặc mã T-SQL của bạn. Trong bài viết này tôi sẽ chỉ cho bạn các cách khác nhau để sử dụng mệnh đề OUTPUT để lấy thông tin trong hai bảng giả này

Sử dụng Mệnh đề đầu ra trên Câu lệnh INSERT

Khi bạn sử dụng mệnh đề OUTPUT trên câu lệnh INSERT, các giá trị cột được chèn có thể được trả lại cho ứng dụng đang gọi và/hoặc mã T-SQL của bạn. Để cho bạn thấy nó hoạt động như thế nào, trước tiên hãy để tôi tạo một bảng Sách trống có thể được sử dụng để chèn các bản ghi. Mã trong Liệt kê 1 có thể được sử dụng để tạo bảng Sách

USE tempdb;
 GO
 CREATE TABLE Book (
      Title varchar(100)   NOT NULL,
      Author varchar(100)   NOT NULL,
      PaperbackCheck   char(3) NOT NULL DEFAULT 'NO',
        Pages int NULL);

Liệt kê 1. Code tạo bảng Book

Để chứng minh việc sử dụng mệnh đề OUTPUT, tôi sẽ chèn một hàng vào bảng này bằng cách sử dụng mã trong Liệt kê 2

INSERT INTO Book (Title,   Author, Pages)
      OUTPUT INSERTED.*
        VALUES('The Da Vinci Code','Dan Brown',597);

Liệt kê 2. Sử dụng mệnh đề OUTPUT trên câu lệnh INSERT

Mã trong Liệt kê 2 chèn một hàng vào bảng Sách và sử dụng mệnh đề OUTPUT để có thể trả lại các giá trị cột đã chèn cho ứng dụng của tôi. Trong mã của tôi, sau mệnh đề OUTPUT, tôi đã sử dụng “INSERTED. *” để yêu cầu SQL Server trả về mọi giá trị cột được chèn vào ứng dụng của tôi. Khi tôi chạy mã trong Liệt kê 2 từ cửa sổ truy vấn bên trong SQL Server Management Studio, tôi nhận được kết quả được hiển thị trong Báo cáo 1 trong ngăn kết quả

Title                                    Author            PaperbackCheck Pages
--------------------------------------   ----------------- -------------- -----------
The Da Vinci   Code                      Dan Brown         NO               597

báo cáo 1. Kết quả từ việc chạy mã trong Liệt kê 2

Bằng cách xem các giá trị cột được trả về ngăn kết quả của tôi trong Báo cáo 1, bạn sẽ thấy một giá trị cho mỗi cột trong bảng Sách của tôi. Lưu ý rằng tôi thậm chí đã nhận được một giá trị cho Kiểm tra bìa mềm, đây là cột mà tôi không có trong câu lệnh INSERT của mình. Bằng cách sử dụng mệnh đề OUTPUT, giờ đây bạn có thể nhận các giá trị cho tất cả các cột có ràng buộc cột, như giá trị nhận dạng hoặc trong trường hợp của tôi trong Liệt kê 2, cột có ràng buộc mặc định

Khi sử dụng mệnh đề OUTPUT, giống như tôi đã làm trong Liệt kê 2, mệnh đề này trả về dữ liệu cột đã chèn cho ứng dụng đang gọi, bạn không thể có trình kích hoạt trên bảng của mình. Nếu bạn cần có một trình kích hoạt thì bạn sẽ cần sử dụng mệnh đề OUTPUT kết hợp với tùy chọn INTO, như tôi đã thực hiện trong Liệt kê 3

ALTER TABLE BOOK ADD Id   INT NOT NULL IDENTITY;
GO
DECLARE @Inserted TABLE(
      Id int,
      Title varchar(100),
      Author   varchar(100));
INSERT INTO Book
   OUTPUT INSERTED.Id,
          INSERTED.Title,
          INSERTED.Author
   INTO @Inserted
   VALUES('To Kill a   Mocking Bird','Harper Lee','YES',323),
         ('The Catcher in   the Rye','J.D. Salinger','Yes',277),
         ('Cutting for   Stone','Abraham Verghese','No',541),
         ('The Great   Gatsby','F. Scott Fitzgerald','Yes',180),
         ('1984',' George   Orwell','Yes',298),
         ('Harry Potter   and the Sorcerer''s Stone','J.K. Rowling','Yes',310);
SELECT * FROM @Inserted;

Liệt kê 3. Sử dụng mệnh đề INTO để điền vào một biến bảng

Khi tôi chạy mã trong Liệt kê 3, tôi nhận được kết quả trong Báo cáo 2

Id      Title                                   Author
-----   -----------------------------------     --------------------------------------
2     To Kill a Mocking   Bird                  Harper Lee
3     The Catcher in the   Rye                  J.D. Salinger
4     Cutting for   Stone                       Abraham Verghese
5     The Great   Gatsby                        F. Scott Fitzgerald
6       1984                                    George Orwell
7     Harry Potter and the   Sorcerer's Stone   J.K. Rowling
 

báo cáo 2. Đầu ra được trả về khi chạy mã trong Liệt kê 3

Nếu bạn nhìn vào đoạn mã trong Liệt kê 3, tôi đã làm một vài điều khác nhau. Đầu tiên tôi đã thêm một cột nhận dạng vào Bảng sách của mình. Tiếp theo, tôi đã khai báo một biến bảng có tên @Inserted, tôi đã theo dõi biến này bằng cách chèn hai hàng vào bảng của mình, rồi cuối cùng tôi chọn các hàng từ bảng @Inserted của mình. Bằng cách nhìn vào câu lệnh INSERT, bạn sẽ thấy tôi đã sử dụng mệnh đề INTO để chỉ chèn các cột cụ thể từ bảng giả INSERTED vào biến bảng của tôi @Inserted. Ngoài ra, bạn nên lưu ý rằng một trong những cột đó là cột danh tính của tôi. Bằng cách có các giá trị cột nhận dạng, sau đó tôi có thể sử dụng các giá trị này, nếu ứng dụng của tôi cần chúng

Sử dụng Mệnh đề OUTPUT trên Câu lệnh DELETE

Sử dụng mệnh đề OUTPUT trên câu lệnh DELETE rất giống với việc sử dụng mệnh đề OUTPUT trên câu lệnh INSERT. Một điểm khác biệt cần lưu ý là tên của bảng giả khi xóa bản ghi là DELETED. Ngoài ra, mọi thứ khác đều giống nhau. Hãy để tôi đi qua một vài ví dụ để bạn có thể hiểu đầy đủ cách sử dụng mệnh đề OUTPUT trên câu lệnh DELETE.  

Trong ví dụ đầu tiên của tôi, tôi muốn trả về tất cả các giá trị cột cho mọi bản ghi đã bị xóa và tôi muốn những giá trị đó được trả lại cho chương trình gọi của tôi;

DELETE Book OUTPUT DELETED.* WHERE Id = 1;

Liệt kê 4. Trả lại tất cả các giá trị cột đã xóa cho ứng dụng đang gọi

Khi tôi chạy mã này, tôi nhận được đầu ra trong Báo cáo 3 được trả về chương trình gọi điện của tôi

Title                     Author                PaperbackCheck Pages       Id
-----------------------   --------------------- -------------- ----------- ------
The Da Vinci Code       Dan   Brown             NO             597         1

báo cáo 3. Kết quả trả về khi chạy mã trong Liệt kê 4

Đoạn mã trong Liệt kê 4 chỉ xóa 1 bản ghi. Do đó, chỉ có một bản ghi được trả lại cho chương trình gọi điện của tôi. Thông tin được trả về chứa tất cả các giá trị cột khác nhau cho bản ghi đã xóa

Bạn cũng có thể chỉ định các cột bạn muốn trả về từ bảng giả DELETED, tương tự như những gì chúng ta đã làm với câu lệnh INSERT trong Liệt kê 3. Trong Liệt kê 5, tôi trình bày cách trả về chỉ hai giá trị cột từ bảng giả DELETED.  

DELETE Book OUTPUT   DELETED.Title, 
                     DELETED.Id 
     WHERE Id > 2 and Id < 5;

Liệt kê 5. Chỉ xuất cột Tiêu đề vào bảng giả DELETED

Khi tôi chạy mã trong Liệt kê 5, hai hàng sẽ bị xóa, những hàng có giá trị Id là 3 và 4. Nhưng vì mã này đã xác định cụ thể các cột Tiêu đề và Id, đó là những giá trị cột duy nhất được trả về cho chương trình gọi điện của tôi

Sử dụng Mệnh đề OUTPUT trên Câu lệnh CẬP NHẬT

Giống như câu lệnh INSERT và DELETE, bạn cũng có thể sử dụng mệnh đề OUTPUT trên câu lệnh UPDATE. Sử dụng mệnh đề OUTPUT trên câu lệnh CẬP NHẬT cho phép bạn trả về các giá trị cột từ cả bảng giả DELETED và INSERTED. Để chứng minh điều này, hãy để tôi chạy mã trong danh sách 6, mã này sẽ cập nhật một hàng

________số 8

Liệt kê 6. Sử dụng mệnh đề OUTPUT trên câu lệnh CẬP NHẬT

Chạy mã trong Liệt kê 6 từ cửa sổ truy vấn SQL Server Management Studio sẽ trả về một hàng đầu ra duy nhất chứa tất cả các cột từ các bảng giả DELETED và INSERTED, trong đó các giá trị cột của bảng DELETED sẽ được hiển thị trước tiên, theo sau là INSERTED .  

Bằng cách có sẵn cả thông tin bảng giả DELETED và INSERTED, bạn có thể tạo bảng kiểm toán có thể chứa hình ảnh trước và sau của các giá trị cột. Để làm điều này, bạn sẽ sử dụng tùy chọn INTO của mệnh đề OUTPUT. Để minh họa cách xây dựng một bảng kiểm toán, hãy để tôi chạy mã Liệt kê 7

DECLARE @AuditLog TABLE (
  UpdateID int,
  DeletedPages int,
  UpdatedPages int)
UPDATE Book
  SET Pages = 301  
  OUTPUT INSERTED.Id,
         DELETED.Pages,
         INSERTED.Pages
  INTO @AuditLog
  WHERE Id = 7;
SELECT   * FROM @DELETEDINSERTED;

Liệt kê 7. Xây dựng bảng Kiểm tra bằng tùy chọn INTO của mệnh đề OUTPUT

Trong Liệt kê 7, lần đầu tiên tôi tạo bảng kiểm toán của mình, trong trường hợp này là tên biến bảng @DELETEDINSERTED. Bảng này sẽ ghi lại hình ảnh trước và sau của một bản ghi được cập nhật. Vì câu lệnh CẬP NHẬT của tôi chỉ cập nhật cột Trang nên bảng kiểm tra của tôi sẽ chỉ chứa các giá trị trước và sau của cột Trang. Nếu bạn nhìn vào câu lệnh UPDATE trong Liệt kê 7, bạn sẽ thấy tôi đã bao gồm một mệnh đề OUTPUT chỉ xác định ba cột sẽ được xuất ra. ĐƯỢC CHÈN. ID, ĐÃ XÓA. Các trang và ĐƯỢC CHÈN. trang. Vì mệnh đề OUTPUT này cũng chứa tùy chọn INTO, nên tôi sẽ lấy hình ảnh trước và sau của cột Trang được đặt vào biến bảng của tôi @AuditLog. Nếu bạn chạy mã này, bạn sẽ thấy rằng câu lệnh SELECT ở cuối mã trong Liệt kê 7 xác nhận rằng hình ảnh trước và sau của cột Trang được ghi lại trong bảng @AuditLog của tôi

Sử dụng Mệnh đề OUTPUT trên Câu lệnh MERGE

Câu lệnh MERGE cũng hỗ trợ mệnh đề OUTPUT. Bằng cách sử dụng mệnh đề OUTPUT với tùy chọn INTO trên câu lệnh MERGE, bạn có thể tạo một bản kiểm tra để hiển thị bản ghi nào đã được cập nhật, chèn hoặc xóa. Để chứng minh điều này hoạt động như thế nào, hãy xem mã trong Liệt kê 8 sẽ thực hiện câu lệnh MERGE sẽ cập nhật một bản ghi và chèn một bản ghi khác.  

INSERT INTO Book (Title,   Author, Pages)
      OUTPUT INSERTED.*
        VALUES('The Da Vinci Code','Dan Brown',597);
0

Liệt kê 8. MERGE mẫu sử dụng mệnh đề OUTPUT

Trong ví dụ về Liệt kê 8 của tôi, tôi đã sử dụng mệnh đề OUTPUT để xác định liệu một hành động INSERT hoặc UPDATE có được thực hiện đối với bảng mục tiêu của tôi hay không. Tôi làm điều này bằng cách xuất giá trị $action. Ngoài ra, tôi xuất tất cả các cột trong bảng giả DELETED và INSERTED thành tên biến bảng @AuditLog2. Nếu bạn chạy mã này, bạn sẽ thấy câu lệnh CHỌN sẽ hiển thị các hàng từ @AuditLog2 của tôi sẽ xác nhận rằng một hàng đã được chèn và một hàng đã được cập nhật

Hạn chế cần xem xét khi sử dụng mệnh đề OUTPUT

Có một số hạn chế mà bạn cần xem xét nếu định sử dụng mệnh đề OUTPUT. Dưới đây là danh sách một phần của những hạn chế đó

  • Nếu bạn muốn có các trình kích hoạt trên bảng của mình thì bạn sẽ cần sử dụng tùy chọn INTO của mệnh đề OUTPUT.  
  • Khi nhiều hàng được trả về thông qua mệnh đề OUTPUT, chúng sẽ không được trả về theo thứ tự cụ thể nào
  • Không thể sử dụng mệnh đề OUTPUT trong chế độ xem được phân vùng cục bộ, phân vùng được phân phối hoặc bảng từ xa
  • Không thể sử dụng mệnh đề OUTPUT trong câu lệnh INSERT sử dụng mệnh đề EXECUTE
  • Không thể sử dụng tùy chọn INTO của mệnh đề OUTPUT để chèn vào chế độ xem hoặc chức năng tập hợp hàng

Để biết danh sách đầy đủ các giới hạn, hãy tham khảo Sách trực tuyến

Biết những gì đã được chèn, cập nhật và/hoặc đã xóa

Nếu ứng dụng của bạn cần biết giá trị cột nào được chèn, cập nhật hoặc xóa đối với bảng của bạn, thì mệnh đề OUTPUT là một cách tuyệt vời để thực hiện điều này. Bằng cách sử dụng mệnh đề OUTPUT, ứng dụng của bạn có thể lấy các giá trị được trả về để thực hiện logic bổ sung. Khả năng quyết định có chọn lọc cột nào bạn muốn OUTPUT cung cấp cho bạn sự linh hoạt để xác định loại dấu vết kiểm toán nào bạn muốn mệnh đề OUTPUT tạo ra. Lần tới khi bạn xem xét việc kiểm tra các bản ghi được chèn, cập nhật hoặc bị xóa, hãy cân nhắc xem mệnh đề OUTPUT có cung cấp chức năng bạn cần mà không cần tạo trình kích hoạt hay không

Đầu ra được chèn vào SQL là gì?

Mệnh đề OUTPUT trả về giá trị của mỗi hàng bị ảnh hưởng bởi câu lệnh CHÈN, CẬP NHẬT hoặc XÓA . Nó thậm chí còn hỗ trợ câu lệnh MERGE, được giới thiệu trong phiên bản SQL Server 2008. Kết quả từ mệnh đề OUTPUT có thể được chèn vào một bảng riêng trong quá trình thực hiện truy vấn.

MySQL chèn trở lại là gì?

Khi bạn chèn một hàng vào bảng mà không chỉ định giá trị cho cột id, MySQL sẽ tự động tạo một số nguyên duy nhất tuần tự cho cột id. Hàm LAST_INSERT_ID() trả về số nguyên được tạo tự động đầu tiên ( BIGINT UNSIGNED ) được chèn thành công cho cột AUTO_INCREMENT .

Làm cách nào tôi có thể xem bản ghi được chèn lần cuối trong MySQL?

Nếu bạn là AUTO_INCREMENT với cột, thì bạn có thể sử dụng phương thức last_insert_id() . Phương thức này lấy ID của bản ghi được chèn cuối cùng trong MySQL.

Chèn hoạt động như thế nào trong MySQL?

Lệnh MySQL INSERT được sử dụng để chèn các giá trị được chỉ định . Vì cột Tuổi sử dụng Null làm giá trị mặc định, MySQL sẽ chèn Null vào cột Tuổi nếu bạn không chỉ định rõ ràng giá trị của nó trong câu lệnh INSERT. The command inserts values in the FirstName and LastName columns of the Customers MySQL table. Since the Age column uses Null as a default value, MySQL inserts Null into the Age column if you do not specify explicitly its value in the INSERT statement.