LỰA CHỌN. INTO cho phép các cột đã chọn được lưu trữ trực tiếp vào các biến. Không có tập kết quả nào được tạo ra. Truy vấn sẽ trả về một hàng. Nếu truy vấn không trả về hàng nào thì sẽ xuất hiện cảnh báo có mã lỗi 1329 (Không có dữ liệu) và các giá trị của biến vẫn không thay đổi. Nếu truy vấn trả về nhiều hàng, sẽ xảy ra lỗi 1172 (Kết quả bao gồm nhiều hàng). Nếu câu lệnh có thể truy xuất nhiều hàng, bạn có thể sử dụng Show Mệnh đề INTO cũng có thể được chỉ định ở cuối câu lệnh Trong ngữ cảnh của các câu lệnh như vậy xảy ra như một phần của sự kiện do Bộ lập lịch sự kiện thực hiện, các thông báo chẩn đoán (không chỉ lỗi mà còn cả cảnh báo) được ghi vào nhật ký lỗi và trên Windows, vào nhật ký sự kiện của ứng dụng Câu lệnh này có thể được sử dụng với cả biến cục bộ và biến do người dùng định nghĩa Để biết cú pháp hoàn chỉnh, xem CHỌN Một cách khác để đặt giá trị của biến là câu lệnh SET Kết quả ví dụSELECT id, data INTO @x,@y FROM test.t1 LIMIT 1; SELECT * from t1 where t1.a=@x and t1.b=@y Nếu bạn muốn sử dụng cấu trúc này với SELECT * INTO @x FROM (SELECT t1.a FROM t1 UNION SELECT t2.a FROM t2); Xem thêmBình luậnNội dung được sao chép trên trang web này là tài sản của chủ sở hữu tương ứng và nội dung này không được MariaDB xem xét trước. Quan điểm, thông tin và ý kiến được thể hiện bởi nội dung này không nhất thiết đại diện cho quan điểm của MariaDB hoặc bất kỳ bên nào khác Trình kích hoạt là một tập hợp các hành động được chạy tự động khi một thao tác thay đổi đã chỉ định (câu lệnh SQL INSERT, UPDATE hoặc DELETE) được thực hiện trên một bảng đã chỉ định. Trình kích hoạt hữu ích cho các tác vụ như thực thi quy tắc kinh doanh, xác thực dữ liệu đầu vào và theo dõi kiểm toán nội dung Sử dụng cho kích hoạt
Lợi ích của việc sử dụng trigger trong kinh doanh
Việc triển khai trình kích hoạt SQL dựa trên tiêu chuẩn SQL. Nó hỗ trợ các cấu trúc phổ biến cho hầu hết các ngôn ngữ lập trình. Nó hỗ trợ khai báo các biến cục bộ, các câu lệnh để kiểm soát luồng thủ tục, gán kết quả biểu thức cho các biến và xử lý lỗi Trình kích hoạt MySQL Chúng tôi cho rằng bạn đã quen với "Quy trình lưu trữ MySQL", nếu không, bạn có thể đọc hướng dẫn Quy trình MySQL của chúng tôi. Bạn có thể sử dụng các câu lệnh sau của thủ tục MySQL trong trình kích hoạt
Làm cách nào để tạo trình kích hoạt MySQL? Trình kích hoạt là một đối tượng cơ sở dữ liệu được đặt tên được liên kết với một bảng và kích hoạt khi một sự kiện cụ thể (e. g. thao tác chèn, cập nhật hoặc xóa) xảy ra đối với bảng. Câu lệnh CREATE TRIGGER tạo một trigger mới trong MySQL. Đây là cú pháp cú pháp CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE } Giải trình mệnh đề ĐỊNH NGHĨA. Mệnh đề DEFINER chỉ định tài khoản MySQL sẽ được sử dụng khi kiểm tra các đặc quyền truy cập tại thời điểm kích hoạt trình kích hoạt. Nếu giá trị người dùng được cung cấp, thì đó phải là tài khoản MySQL được chỉ định là 'user_name'@'host_name' (cùng định dạng được sử dụng trong câu lệnh GRANT), CURRENT_USER hoặc CURRENT_USER()
trigger_name. Tất cả trình kích hoạt phải có tên duy nhất trong lược đồ. Trình kích hoạt trong các lược đồ khác nhau có thể có cùng tên thời gian kích hoạt. trigger_time là thời gian hành động kích hoạt. Nó có thể là TRƯỚC hoặc SAU KHI cho biết trình kích hoạt kích hoạt trước hoặc sau mỗi hàng được sửa đổi trigger_event. trigger_event cho biết loại hoạt động kích hoạt trình kích hoạt. Các giá trị trigger_event này được cho phép
tbl_name. Trình kích hoạt được liên kết với bảng có tên tbl_name, bảng này phải tham chiếu đến một bảng cố định. Bạn không thể liên kết trình kích hoạt với bảng TẠM THỜI hoặc chế độ xem trigger_body. trigger_body là câu lệnh sẽ thực thi khi trigger kích hoạt. Để thực thi nhiều câu lệnh, hãy sử dụng lệnh BEGIN. Cấu trúc câu lệnh ghép END. Điều này cũng cho phép bạn sử dụng các câu lệnh tương tự được phép trong các thủ tục được lưu trữ Đây là một ví dụ đơn giản mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec) Trong ví dụ trên, có từ khóa mới 'MỚI' là phần mở rộng của MySQL để kích hoạt. Có hai phần mở rộng MySQL để kích hoạt 'OLD' và 'NEW'. OLD và NEW không phân biệt chữ hoa chữ thường
Cột có tên OLD chỉ được đọc. Bạn có thể tham khảo nó (nếu bạn có quyền CHỌN), nhưng không được sửa đổi nó. Bạn có thể tham khảo một cột có tên MỚI nếu bạn có đặc quyền CHỌN cho cột đó. Trong trình kích hoạt TRƯỚC, bạn cũng có thể thay đổi giá trị của nó bằng SET NEW. col_name = value nếu bạn có đặc quyền CẬP NHẬT cho nó. Điều này có nghĩa là bạn có thể sử dụng trình kích hoạt để sửa đổi các giá trị sẽ được chèn vào một hàng mới hoặc được sử dụng để cập nhật một hàng. (Câu lệnh SET như vậy không có tác dụng trong trình kích hoạt SAU vì thay đổi hàng đã xảy ra rồi. ) Cơ sở dữ liệu mẫu, bảng, cấu trúc bảng, bản ghi bảng cho các ví dụ khác nhau Tên cơ sở dữ liệu. giờ Cấu trúc của bảng. emp_details Bản ghi của bảng (trên một số trường). emp_details mysql> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details; Công cụ tạo MySQL Triggers Bạn có thể viết một thủ tục trong công cụ dòng lệnh của MySQL hoặc bạn có thể sử dụng MySQL workbench, một công cụ giao diện người dùng tuyệt vời (ở đây chúng tôi đã sử dụng phiên bản 5. 3 CN) Công cụ dòng lệnh MySQL. - Chọn Máy khách lệnh MySQL từ menu Bắt đầu Chọn dấu nhắc lệnh MySQL màn hình sau sẽ đến Sau khi đăng nhập thành công, bạn có thể truy cập dấu nhắc lệnh của MySQL Bây giờ bạn có thể viết trình kích hoạt của riêng mình trên một bảng cụ thể, hãy xem ví dụ sau Bàn làm việc MySQL (5. 3 CN). - Chọn bàn làm việc MySQL từ menu Bắt đầu Sau khi chọn bàn làm việc của MySQL, màn hình đăng nhập sau sẽ đến Bây giờ hãy nhập chi tiết đăng nhập Sau khi đăng nhập thành công, một màn hình mới sẽ xuất hiện và từ bảng trình duyệt đối tượng, hãy chọn cơ sở dữ liệu Sau khi chọn cơ sở dữ liệu, chọn các bảng Bây giờ, nhấp chuột phải vào emp_details, một cửa sổ bật lên, nhấp vào Bảng thay đổi Click vào " Alter Table " chi tiết của emp_details sẽ đến Bây giờ hãy nhấp vào tab Kích hoạt trong phần trước, sau đó chọn Thời gian/Sự kiện có thể là SAU KHI XÓA, SAU KHI CHÈN, SAU CẬP NHẬT hoặc TRƯỚC XÓA, TRƯỚC CHÈN HOẶC TRƯỚC CẬP NHẬT. Ta chọn SAU KHI CHÈN, bạn cũng để ý có nút Add Trigger Nhấp vào nút Thêm kích hoạt, mã mặc định trên trình kích hoạt sẽ xuất hiện trên cơ sở chọn Thời gian/Sự kiện Tên kích hoạt. emp_details_AINS USE `hr`; DELIMITER $$ CREATE TRIGGER `emp_details_AINS` AFTER INSERT ON emp_details FOR EACH ROW -- Edit trigger body code below this line. Do not edit lines above this one Sau khi hoàn thành mã, nhấp vào nút áp dụng Ghi chú. Xem văn bản mới Xóa Trình kích hoạt đã xuất hiện trong Thêm nút Kích hoạt. Nhấp vào đây bạn có thể xóa trình kích hoạt Cuối cùng, bạn có thể xem lại tập lệnh một lần nữa, vì không có lỗi, hãy nhấp vào nút Áp dụng Đây là cửa sổ cuối cùng trước khi kết thúc. Hãy nhấp vào nút Kết thúc Nếu bạn xem lược đồ, bạn sẽ thấy trình kích hoạt emp_details_AINS bên dưới bảng emp_details như sau Trình kích hoạt MySQL. Ví dụ SAU KHI CHÈN Trong ví dụ sau, chúng ta có hai bảng. emp_details và log_emp_details. Để chèn một số thông tin vào bảng log_ emp_details (có ba trường id nhân viên, lương và edttime), khi một INSERT xảy ra trong bảng emp_details, chúng tôi đã sử dụng trình kích hoạt sau DELIMITER $$ USE `hr` $$ CREATE DEFINER=`root`@`127.0.0.1` TRIGGER `hr`.`emp_details_AINS` AFTER INSERT ON `hr`.`emp_details` FOR EACH ROW -- Edit trigger body code below this line. Do not edit lines above this one BEGIN INSERT INTO log_emp_details VALUES(NEW.employee_id, NEW.salary, NOW()); END$$ Bản ghi của bảng (trên một số cột). emp_details mysql> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details; +-------------+------------+-----------+---------+----------+----------------+ | EMPLOYEE_ID | FIRST_NAME | LAST_NAME | JOB_ID | SALARY | COMMISSION_PCT | +-------------+------------+-----------+---------+----------+----------------+ | 100 | Steven | King | AD_PRES | 24000.00 | 0.10 | | 101 | Neena | Kochhar | AD_VP | 17000.00 | 0.50 | | 102 | Lex | De Haan | AD_VP | 17000.00 | 0.50 | | 103 | Alexander | Hunold | IT_PROG | 9000.00 | 0.25 | | 104 | Bruce | Ernst | IT_PROG | 6000.00 | 0.25 | | 105 | David | Austin | IT_PROG | 4800.00 | 0.25 | +-------------+------------+-----------+---------+----------+----------------+ 6 rows in set (0.00 sec) Bản ghi của bảng (tất cả các cột). log_emp_details ________số 8_______Bây giờ hãy chèn một bản ghi vào bảng emp_details để xem các bản ghi ở cả hai bảng emp_details và log_emp_details mysql> INSERT INTO emp_details VALUES(236, 'RABI', 'CHANDRA', 'RABI','590.423.45700', '2013-01-12', 'AD_VP', 15000, .5); Query OK, 1 row affected (0.07 sec) mysql> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details; +-------------+------------+-----------+---------+----------+----------------+ | EMPLOYEE_ID | FIRST_NAME | LAST_NAME | JOB_ID | SALARY | COMMISSION_PCT | +-------------+------------+-----------+---------+----------+----------------+ | 100 | Steven | King | AD_PRES | 24000.00 | 0.10 | | 101 | Neena | Kochhar | AD_VP | 17000.00 | 0.50 | | 102 | Lex | De Haan | AD_VP | 17000.00 | 0.50 | | 103 | Alexander | Hunold | IT_PROG | 9000.00 | 0.25 | | 104 | Bruce | Ernst | IT_PROG | 6000.00 | 0.25 | | 105 | David | Austin | IT_PROG | 4800.00 | 0.25 | | 236 | RABI | CHANDRA | AD_VP | 15000.00 | 0.50 | +-------------+------------+-----------+---------+----------+----------------+ 7 rows in set (0.00 sec) mysql> SELECT * FROM log_emp_details; +-------------+----------+---------------------+ | emp_details | SALARY | EDTTIME | +-------------+----------+---------------------+ | 100 | 24000.00 | 2011-01-15 00:00:00 | | 101 | 17000.00 | 2010-01-12 00:00:00 | | 102 | 17000.00 | 2010-09-22 00:00:00 | | 103 | 9000.00 | 2011-06-21 00:00:00 | | 104 | 6000.00 | 2012-07-05 00:00:00 | | 105 | 4800.00 | 2011-06-21 00:00:00 | | 236 | 15000.00 | 2013-07-15 16:52:24 | +-------------+----------+---------------------+ 7 rows in set (0.00 sec) Trình kích hoạt MySQL. Ví dụ TRƯỚC KHI CHÈN Trong ví dụ sau, trước khi chèn bản ghi mới vào bảng emp_details, trình kích hoạt sẽ kiểm tra giá trị cột của FIRST_NAME, LAST_NAME, JOB_ID và mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)0Bây giờ hãy chèn một hàng vào bảng emp_details (kiểm tra các cột FIRST_NAME, LAST_NAME, JOB_ID). mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)1 Bây giờ hãy liệt kê các trường sau của emp_details mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)2 Xem hàng cuối cùng FIRST_NAME -> ' Ana ' đã đổi thành 'Ana' Trình kích hoạt MySQL. Ví dụ SAU KHI CẬP NHẬT Chúng tôi có hai bảng student_mast và stu_log. student_mast có ba cột STUDENT_ID, NAME, ST_CLASS. bảng stu_log có hai cột user_id và description mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)3 Hãy để chúng tôi quảng bá tất cả các sinh viên trong lớp tiếp theo tôi. e. 7 sẽ là 8, 8 sẽ là 9, v.v. Sau khi cập nhật một hàng trong bảng student_mast, một hàng mới sẽ được chèn vào bảng stu_log nơi chúng tôi sẽ lưu trữ id người dùng hiện tại và một mô tả nhỏ về bản cập nhật hiện tại. Đây là mã kích hoạt mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)4 Sau khi cập nhật bảng STUDENT_MAST mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)5 Trình kích hoạt hiển thị cho bạn các bản ghi được cập nhật trong 'stu_log'. Đây là vị trí mới nhất của bảng STUDENT_MAST và STU_LOG mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)6 Trình kích hoạt MySQL. Ví dụ TRƯỚC KHI CẬP NHẬT Chúng tôi có một bảng student_marks với 10 cột và 4 hàng. Chỉ có dữ liệu trong cột STUDENT_ID và NAME mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)7 Bây giờ kỳ thi đã kết thúc và chúng tôi đã nhận được tất cả các điểm môn học, bây giờ chúng tôi sẽ cập nhật bảng, tổng điểm của tất cả các môn học, tỷ lệ phần trăm của tổng điểm và điểm sẽ được tính tự động. Đối với phép tính mẫu này, các điều kiện sau được giả định Tổng số điểm (sẽ được lưu trong cột TOTAL). TỔNG = SUB1 + SUB2 + SUB3 + SUB4 + SUB5 Đây là mã mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)8 Hãy cập nhật điểm của một sinh viên mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount; Query OK, 0 rows affected (0.06 sec)9 Bây giờ hãy kiểm tra bảng STUDENT_MARKS với dữ liệu được cập nhật. Trình kích hoạt hiển thị cho bạn các bản ghi được cập nhật trong 'stu_log' mysql> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details;0 Trình kích hoạt MySQL. Ví dụ SAU KHI XÓA Trong ví dụ 'SAU KHI CẬP NHẬT', chúng tôi có hai bảng student_mast và stu_log. student_mast có ba cột STUDENT_ID, NAME, ST_CLASS và bảng stu_log có hai cột user_id và description. Chúng tôi muốn lưu trữ một số thông tin trong bảng stu_log sau khi thao tác xóa xảy ra trên bảng student_mast. Đây là kích hoạt mysql> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details;1 Cho phép xóa một sinh viên khỏi STUDENT_MAST mysql> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details;2 Đây là vị trí mới nhất của các bảng STUDENT_MAST, STU_LOG mysql> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details;3 MySQL xử lý lỗi như thế nào trong quá trình thực thi kích hoạt?
Xóa trình kích hoạt MySQL Để xóa hoặc hủy kích hoạt, hãy sử dụng câu lệnh DROP TRIGGER. Bạn phải chỉ định tên lược đồ nếu trình kích hoạt không có trong lược đồ (hiện tại) mặc định Làm cách nào để gán kết quả truy vấn CHỌN cho một biến trong MySQL?Để gán giá trị cho một biến, hãy sử dụng câu lệnh SET . Đây là phương pháp ưa thích để gán một giá trị cho một biến. Một biến cũng có thể có một giá trị được gán bằng cách được tham chiếu trong danh sách chọn của câu lệnh SELECT.
Chúng ta có thể sử dụng trigger với câu lệnh SELECT không?Trình kích hoạt là một đối tượng cơ sở dữ liệu, trừ khi bị vô hiệu hóa, sẽ tự động thực thi một tập hợp các câu lệnh SQL được chỉ định, được gọi là hành động kích hoạt, khi một sự kiện kích hoạt được chỉ định xảy ra. Sự kiện kích hoạt bắt đầu hành động kích hoạt có thể là một câu lệnh CHỌN, XÓA, CẬP NHẬT hoặc CHỌN .
Chúng ta có thể chuyển tham số trong trình kích hoạt không?bạn không thể chuyển biến vào trình kích hoạt . cách duy nhất để lấy thông tin trong trình kích hoạt là có thể CHỌN nó dựa trên các bảng ĐƯỢC CHÈN hoặc ĐÃ XÓA hoặc thêm một cột vào bảng bị ảnh hưởng và đặt giá trị vào cột đó.
Làm cách nào để viết CHỌN vào trong MySQL?13, “Câu lệnh CHỌN”), INTO có thể xuất hiện ở các vị trí khác nhau. . trước TỪ. Thí dụ. CHỌN * VÀO @myvar TỪ t1; Trước mệnh đề khóa sau. Thí dụ. CHỌN * TỪ t1 VÀO @myvar ĐỂ CẬP NHẬT; Ở cuối CHỌN. Thí dụ. CHỌN * TỪ t1 ĐỂ CẬP NHẬT VÀO @myvar; |