Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm việc với Trigger trong Cơ sở dữ liệu MySQL - Hướng dẫn

A kích hoạt là một lệnh SQL được xác định trước được tự động thực thi khi các hành động cụ thể xảy ra trong cơ sở dữ liệu. Nó có thể được kích hoạt trước hoặc sau một INSERT , UPDATE hoặc DELETE sự kiện.

Các trình kích hoạt chủ yếu được sử dụng để duy trì logic phần mềm trong máy chủ MySQL và chúng có một số lợi ích:

  • Trình kích hoạt giúp giữ cho các hoạt động toàn cầu được tập trung tại một địa điểm.

  • Chúng giảm mã phía máy khách và giúp giảm thiểu các chuyến đi khứ hồi được thực hiện đến máy chủ cơ sở dữ liệu.

  • Chúng giúp làm cho các ứng dụng có thể mở rộng hơn trên các nền tảng khác nhau.

Một số trường hợp sử dụng phổ biến của trình kích hoạt bao gồm ghi nhật ký kiểm tra, tính toán trước các giá trị cơ sở dữ liệu (ví dụ:tổng tích lũy) và thực thi các quy tắc xác thực và toàn vẹn dữ liệu phức tạp.

Trong hướng dẫn này, bạn sẽ học:

  • Cấu trúc của thesyntax cho trình kích hoạt như thế nào.

  • Cách tạo trình kích hoạt được thực thi trước khi các sự kiện cơ sở dữ liệu khác xảy ra.

  • Cách tạo trình kích hoạt được thực thi sau khi các sự kiện cơ sở dữ liệu khác xảy ra.

  • Cách xóa trình kích hoạt.

Trước khi bạn bắt đầu

  1. Nếu bạn chưa làm như vậy, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo phiên bản Máy tính của chúng tôi.

  2. Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Máy tính của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, định cấu hình tên máy chủ của mình, tạo tài khoản người dùng hạn chế và tăng cường quyền truy cập SSH.

  3. Máy chủ và máy khách MySQL được cài đặt trên máy chủ Linode. Hướng dẫn cài đặt cho MySQL có sẵn cho các bản phân phối khác nhau trong phần MySQL của chúng tôi.

Chuẩn bị Cơ sở dữ liệu

Để hiểu rõ hơn về cách hoạt động của trình kích hoạt, chúng tôi sẽ tạo cơ sở dữ liệu mẫu và thêm dữ liệu mẫu vào đó. Sau đó, chúng tôi sẽ tạo các trình kích hoạt khác nhau trên cơ sở dữ liệu như một bằng chứng về bài tập khái niệm.

  1. Đầu tiên, đăng nhập vào Máy chủ MySQL của bạn:

    mysql -u root -p
    

    Sau đó, nhập mật khẩu gốc của máy chủ MySQL của bạn và nhấn Enter để tiếp tục.

  2. Tiếp theo, bạn sẽ thấy một lời nhắc MySQL tương tự như lời nhắc được hiển thị bên dưới:

    mysql >
  3. Tạo test_database bằng cách chạy lệnh dưới đây:

    CREATE DATABASE test_database;
    

    Đầu ra:

    Query OK, 1 row affected (0.02 sec)
  4. Chuyển sang cơ sở dữ liệu:

    USE test_database;
    

    Đầu ra:

    Database changed
  5. Sau khi cơ sở dữ liệu được chọn, chúng tôi sẽ tạo một số bảng mà chúng tôi sẽ sử dụng để trình diễn các trình kích hoạt. Chúng ta sẽ bắt đầu bằng cách tạo stores bàn. Bảng này sẽ chứa thông tin về hai cửa hàng / văn phòng mẫu nơi hoạt động kinh doanh giả định của chúng tôi:

    CREATE TABLE stores
    (
    store_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    store_name VARCHAR(50)
    ) ENGINE=InnoDB;
    

    Đầu ra:

    Query OK, 0 rows affected (0.07 sec)
  6. Tiếp theo, thêm hai bản ghi vào stores bảng bằng cách chạy các lệnh bên dưới:

    INSERT INTO stores (store_name) VALUES ('Philadelphia');
    INSERT INTO stores (store_name) VALUES ('Galloway');
    

    Sau mỗi lệnh, bạn sẽ nhận được kết quả bên dưới:

    Query OK, 1 row affected (0.08 sec)
    ...
  7. Xác nhận các bản ghi bằng cách chạy lệnh dưới đây:

    SELECT * FROM stores;
    

    Đầu ra:

    +----------+--------------+
    | store_id | store_name   |
    +----------+--------------+
    |        1 | Philadelphia |
    |        2 | Galloway     |
    +----------+--------------+
    2 rows in set (0.01 sec)
  8. Tiếp theo, tạo products bàn. Bảng sẽ chứa các sản phẩm khác nhau đang được cung cấp trong cửa hàng:

    CREATE TABLE products
    (
    product_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(40),
    cost_price DOUBLE,
    retail_price DOUBLE,
    availability VARCHAR(5)
    ) ENGINE=InnoDB;
    

    Đầu ra:

    Query OK, 0 rows affected (0.13 sec)
    • Mỗi sản phẩm sẽ được nhận dạng duy nhất bởi một product_id .

    • product_name trường sẽ chỉ định tên của các mục.

    • cost_priceretail_price các trường sẽ xác định giá mua và giá bán tương ứng.

    • availability cột sẽ xác định tính sẵn có của sản phẩm ở các cửa hàng khác nhau. Nếu sản phẩm chỉ có sẵn tại cửa hàng địa phương của chúng tôi (Philadelphia), chúng tôi sẽ ký hiệu nó bằng LOCAL giá trị. Nếu không, chúng tôi sẽ sử dụng giá trị của ALL để biểu thị một sản phẩm có sẵn ở cả hai cửa hàng (Philadelphia và Galloway).

  9. Thêm dữ liệu mẫu vào products bảng:

    INSERT INTO products (product_name, cost_price, retail_price, availability) VALUES ('WIRELESS MOUSE', '18.23', '30.25','ALL');
    
    INSERT INTO products (product_name, cost_price, retail_price, availability) VALUES ('8 MP CAMERA', '60.40', '85.40','ALL');
    
    INSERT INTO products (product_name, cost_price, retail_price, availability) VALUES ('SMART WATCH', '189.60', '225.30','LOCAL');
    

    Bạn sẽ nhận được kết quả hiển thị bên dưới sau mỗi lệnh chèn:

    Query OK, 1 row affected (0.02 sec)
    ...
  10. Xác nhận xem sản phẩm đã được chèn hay chưa bằng cách chạy lệnh bên dưới:

    SELECT * FROM products;
    

    Đầu ra:

    +------------+----------------+------------+--------------+--------------+
    | product_id | product_name   | cost_price | retail_price | availability |
    +------------+----------------+------------+--------------+--------------+
    |          1 | WIRELESS MOUSE |      18.23 |        30.25 | ALL          |
    |          2 | 8 MP CAMERA    |       60.4 |         85.4 | ALL          |
    |          3 | SMART WATCH    |      189.6 |        225.3 | LOCAL        |
    +------------+----------------+------------+--------------+--------------+
    3 rows in set (0.00 sec)
  11. Tiếp theo, tình trạng còn hàng của sản phẩm sẽ được ánh xạ sang một bảng khác có tên products_to_stores . Bảng này sẽ chỉ tham chiếu đến product_id từ products bảng và store_id từ stores bảng nơi có mặt hàng.

    Tạo products_to_stores bảng bằng cách chạy mã bên dưới:

    CREATE TABLE products_to_stores
    (
    ref_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT,
    store_id BIGINT
    ) ENGINE=InnoDB;
    

    Đầu ra:

    Query OK, 0 rows affected (0.14 sec)
  12. Tiếp theo, chúng tôi sẽ tạo một archived_products bàn. Bảng sẽ chứa thông tin về các sản phẩm đã xóa để tham khảo trong tương lai:

    CREATE TABLE archived_products
    (
    product_id BIGINT PRIMARY KEY ,
    product_name VARCHAR(40),
    cost_price DOUBLE,
    retail_price DOUBLE,
    availability VARCHAR(5)
    ) ENGINE=InnoDB;
    

    Đầu ra:

    Query OK, 0 rows affected (0.14 sec)
  13. Cuối cùng, chúng tôi sẽ tạo một products_price_history bảng để theo dõi các mức giá khác nhau của từng sản phẩm theo thời gian:

    CREATE TABLE products_price_history
    (
    product_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    price_date DATETIME,
    retail_price DOUBLE
    ) ENGINE=InnoDB;
    

    Đầu ra:

    Query OK, 0 rows affected (0.14 sec)

Khi cấu trúc cơ sở dữ liệu của chúng tôi đã sẵn sàng, bây giờ chúng tôi có thể tiếp tục và tìm hiểu cú pháp cơ bản của trình kích hoạt cơ sở dữ liệu MySQL để tạo mẫu đầu tiên của chúng tôi.

Cú pháp trình kích hoạt

Như đã chỉ ra trước đó, trình kích hoạt được kích hoạt tự động trước hoặc sau khi lệnh SQL được chạy trong cơ sở dữ liệu. Cú pháp cơ bản để tạo trình kích hoạt như sau:

CREATE TRIGGER TRIGGER_NAME

TRIGGER_TIME TRIGGER_EVENT

ON TABLE_NAME FOR EACH ROW

[TRIGGER BODY];
  • TRIGGER_NAME :Mỗi trình kích hoạt phải có một tên duy nhất và bạn nên xác định nó ở đây.

  • TRIGGER_TIME :Hoặc BEFORE hoặc AFTER .

  • TRIGGER_EVENT :Bạn cần chỉ định sự kiện cơ sở dữ liệu sẽ gọi trình kích hoạt:INSERT , UPDATE hoặc DELETE .

  • TRIGGER BODY :Điều này chỉ định lệnh SQL thực tế (hoặc các lệnh) mà bạn muốn được chạy bởi trình kích hoạt của mình.

Nếu thân trình kích hoạt có nhiều hơn một câu lệnh SQL, bạn phải đặt nó trong một BEGIN...END khối. Ngoài ra, bạn sẽ cần tạm thời thay đổi DELIMITER điều đó báo hiệu phần cuối của nội dung trình kích hoạt đến một giá trị mới. Điều này đảm bảo rằng các câu lệnh bên trong phần thân không bị ứng dụng khách MySQL của bạn diễn giải sớm. Ví dụ về điều này trông giống như sau:

DELIMITER &&

CREATE TRIGGER TRIGGER_NAME

TRIGGER_TIME TRIGGER_EVENT

ON TABLE_NAME FOR EACH ROW

BEGIN

[TRIGGER BODY]

END &&

DELIMITER ;
Lưu ý Dòng cuối cùng của ví dụ này thay đổi DELIMITER quay lại ; mặc định giá trị.

Tạo trước khi kích hoạt sự kiện

Trong phần này, chúng ta sẽ xem xét các loại trình kích hoạt khác nhau được kích hoạt trước một hoạt động cơ sở dữ liệu. Chúng bao gồm BEFORE INSERT , BEFORE UPDATEBEFORE DELETE kích hoạt.

Tạo trước khi chèn kích hoạt

Chúng tôi sẽ tạo BEFORE INSERT đầu tiên của chúng tôi cò súng. Trình kích hoạt sẽ đảm bảo rằng giá bán lẻ của sản phẩm lớn hơn giá vốn bất cứ khi nào các mặt hàng được chèn vào products bàn. Nếu không, người dùng cơ sở dữ liệu sẽ gặp lỗi.

  1. Trong khi vẫn ở trên mysql > nhắc, nhập lệnh dưới đây:

    DELIMITER $$
    
    CREATE TRIGGER price_validator
    
    BEFORE INSERT
    
    ON products FOR EACH ROW
    
    IF NEW.cost_price>=NEW.retail_price
    
    THEN
    
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Retail price must be greater than cost price.';
    
    END IF $$
    
    DELIMITER ;
    
    • Đoạn mã trên xác định tên trình kích hoạt (price_validator ), thời gian (BEFORE ), sự kiện (INSERT ) và bảng (products ) bị ảnh hưởng.

    • Trình kích hoạt của chúng tôi sử dụng NEW từ khóa để kiểm tra cost_priceretail_price trước khi một bản ghi được chèn vào products bảng, sử dụng IF...THEN...END IF tuyên bố.

    • Nếu cost_price lớn hơn hoặc bằng retail price , trình kích hoạt của chúng tôi yêu cầu MySQL đưa ra một ngoại lệ tùy chỉnh hướng dẫn người dùng sửa lỗi.

  2. Để kiểm tra trình kích hoạt ở trên, hãy thử chèn một sản phẩm vi phạm quy tắc xác thực:

    INSERT INTO products (product_name, cost_price, retail_price, availability) VALUES ('GAMING MOUSE PAD', '145.00', '144.00','LOCAL');
    

    Đầu ra:

    ERROR 1644 (45000): Retail price must be greater than cost price.

    Các lệnh chèn ở trên không thành công vì retail_price (144,00) không lớn hơn cost_price (145,00).

Tạo trình kích hoạt trước khi cập nhật

Tiếp theo, chúng tôi sẽ tạo một BEFORE UPDATE cò súng. Trình kích hoạt này sẽ ngăn người dùng cơ sở dữ liệu chỉnh sửa tên sản phẩm sau khi một sản phẩm đã được chèn vào cơ sở dữ liệu. Nếu bạn có nhiều người dùng làm việc trong cơ sở dữ liệu, hãy BEFORE UPDATE trình kích hoạt có thể được sử dụng để đặt các giá trị ở chế độ chỉ đọc và điều này có thể ngăn người dùng độc hại hoặc bất cẩn sửa đổi bản ghi một cách không cần thiết.

  1. Tạo product_name_validator mới kích hoạt bằng lệnh bên dưới:

    DELIMITER $$
    
    CREATE TRIGGER product_name_validator
    
    BEFORE UPDATE
    
    ON products FOR EACH ROW
    
    IF NEW.product_name<>OLD.product_name
    
    THEN
    
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Product name is read-only and it can not be changed.';
    
    END IF $$
    
    DELIMITER ;
    

    Trình kích hoạt này so sánh các giá trị của product_name mới (NEW.product_name ) và tên cũ đã có trong cơ sở dữ liệu (OLD.product_name ). Nếu có sự không khớp, một ngoại lệ sẽ được đưa ra.

  2. Để gọi product_name_validator kích hoạt, chúng tôi có thể cố gắng cập nhật tên của sản phẩm với ID 1 :

    UPDATE products SET product_name='WIRELESS BLUETOOTH MOUSE' WHERE product_id='1';
    

    Đầu ra:

    ERROR 1644 (45000): Product name is read-only and it can not be changed.

Xác định trước khi xóa kích hoạt

Trong phần này, bạn sẽ thấy cách bạn có thể xác định BEFORE DELETE kích hoạt để ngăn người dùng xóa các bản ghi cụ thể khỏi bảng.

  1. Để tạo prevent_delete kích hoạt, chạy lệnh dưới đây:

    DELIMITER $$
    
    CREATE TRIGGER prevent_delete
    
    BEFORE DELETE
    
    ON products FOR EACH ROW
    
    IF OLD.availability='ALL'
    
    THEN
    
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The product can not be deleted because it is available in ALL stores.';
    
    END IF $$
    
    DELIMITER ;
    

    Trình kích hoạt này sẽ ngăn các sản phẩm được đánh dấu bằng giá trị ALL trong cột tính khả dụng không bị xóa.

  2. Tiếp theo, hãy thử xóa sản phẩm đầu tiên khỏi bảng sản phẩm và xem liệu trình kích hoạt có được gọi hay không:

    DELETE FROM products WHERE product_id='1';
    

    Đầu ra:

    ERROR 1644 (45000): The product can not be deleted because it is available in ALL stores.

Chúng tôi đã xem xét các trình kích hoạt khác nhau được gọi trước một hoạt động cơ sở dữ liệu. Tiếp theo, chúng ta sẽ xem xét các loại trình kích hoạt khác được kích hoạt sau các sự kiện cơ sở dữ liệu.

Tạo sau sự kiện kích hoạt

Trong môi trường sản xuất, bạn có thể muốn một số trình kích hoạt được tự động thực thi sau khi sự kiện cơ sở dữ liệu xảy ra (ví dụ:chèn bản ghi vào các bảng khác nhau). Các ví dụ dưới đây chứng minh cách sử dụng các loại trình kích hoạt này trong cơ sở dữ liệu mẫu của chúng tôi.

Tạo trình kích hoạt sau khi chèn

Ví dụ này tạo một trình kích hoạt có tên là product_availability chèn các bản ghi ánh xạ vào products_to_stores bàn. Trình kích hoạt này được sử dụng để thực thi logic nghiệp vụ; đặc biệt, nó giúp xác định tính sẵn có của sản phẩm cho các cửa hàng khác nhau.

  1. Chạy mã bên dưới để tạo product_availability cò súng. Vì chúng tôi có nhiều dòng mã trong phần thân trình kích hoạt, chúng tôi sẽ sử dụng BEGIN...END khối:

    DELIMITER $$
    
    CREATE TRIGGER product_availability
    
    AFTER INSERT
    
    ON products FOR EACH ROW
    
    BEGIN
    
    IF NEW.availability='LOCAL' then
    
    INSERT INTO products_to_stores (product_id, store_id) VALUES (NEW.product_id, '1');
    
    ELSE
    
    INSERT INTO products_to_stores (product_id, store_id) VALUES (NEW.product_id, '1');
    
    INSERT INTO products_to_stores (product_id, store_id) VALUES (NEW.product_id, '2');
    
    END IF;
    
    END $$
    
    DELIMITER ;
    
    • Khi một mục đang được chèn vào products bảng, trình kích hoạt sẽ kiểm tra availability trường.

    • Nếu nó được đánh dấu bằng LOCAL giá trị, sản phẩm sẽ chỉ được cung cấp tại một cửa hàng.

    • Bất kỳ giá trị nào khác sẽ hướng dẫn trình kích hoạt cung cấp sản phẩm cho hai cửa hàng mà chúng tôi đã tạo trước đó.

  2. Để xem product_availability kích hoạt hoạt động, chèn hai bản ghi vào bảng sản phẩm:

    INSERT INTO products (product_name, cost_price, retail_price, availability) VALUES ('BLUETOOTH KEYBOARD', '17.60', '23.30','LOCAL');
    INSERT INTO products (product_name, cost_price, retail_price, availability) VALUES ('DVB-T2 RECEIVE', '49.80', '53.40','ALL');
    
  3. Sau đó, truy vấn products_to_stores bảng:

    SELECT * FROM products_to_stores;
    

    Bạn sẽ thấy một đầu ra tương tự như kết quả được hiển thị bên dưới:

    +--------+------------+----------+
    | ref_id | product_id | store_id |
    +--------+------------+----------+
    |      1 |          4 |        1 |
    |      2 |          5 |        1 |
    |      3 |          5 |        2 |
    +--------+------------+----------+
    3 rows in set (0.00 sec)

Xác định một Trình kích hoạt Sau khi Cập nhật

Một trình kích hoạt cũng có thể được kích hoạt sau UPDATE biến cố. Chúng tôi sẽ xem cách chúng tôi có thể tận dụng loại trình kích hoạt này để theo dõi những thay đổi về giá trong cửa hàng của chúng tôi theo thời gian.

  1. Tạo product_history_updater kích hoạt bằng cách chạy lệnh dưới đây:

    CREATE TRIGGER product_history_updater
    
    AFTER UPDATE
    
    ON products FOR EACH ROW
    
    INSERT INTO products_price_history (product_id, price_date, retail_price) VALUES (OLD.product_id, NOW(), NEW.retail_price);
    

    Trình kích hoạt này ghi lại các thay đổi đối với retail_price của sản phẩm trong products_price_history bảng.

    Lưu ý Không giống như các ví dụ trước, trình kích hoạt này chỉ có một câu lệnh trong nội dung của trình kích hoạt, vì vậy chúng tôi không cần thay đổi DELIMITER .
  2. Sau đó, hãy thử cập nhật giá của sản phẩm đầu tiên bằng cách chạy lệnh bên dưới:

    UPDATE products SET retail_price='36.75' WHERE product_id='1';
    
  3. Tiếp theo, truy vấn products_price_history để xem liệu sự thay đổi giá đã được ghi lại hay chưa:

    SELECT * FROM products_price_history;
    

    Nếu trình kích hoạt hoạt động như mong đợi, bạn sẽ nhận được kết quả bên dưới:

    +------------+---------------------+--------------+
    | product_id | price_date          | retail_price |
    +------------+---------------------+--------------+
    |          1 | 2020-01-28 11:46:21 |        36.75 |
    +------------+---------------------+--------------+
    1 row in set (0.00 sec)

Tạo trình kích hoạt sau khi xóa

Trong một số trường hợp, bạn có thể muốn ghi nhật ký các hoạt động xóa sau khi một hành động cụ thể đã xảy ra trong cơ sở dữ liệu. Bạn có thể đạt được điều này bằng cách sử dụng AFTER DELETE kích hoạt.

  1. Tạo một product_archiver mới kích hoạt bằng lệnh bên dưới:

    CREATE TRIGGER product_archiver
    
    AFTER DELETE
    
    ON products FOR EACH ROW
    
    INSERT INTO archived_products (product_id, product_name, cost_price, retail_price, availability) VALUES (OLD.product_id, OLD.product_name, OLD.cost_price, OLD.retail_price, OLD.availability);
    

    Trình kích hoạt này lưu trữ các sản phẩm đã xóa trong một bảng riêng biệt có tên archived_products . Khi một mặt hàng bị xóa khỏi products chính , trình kích hoạt của chúng tôi sẽ tự động ghi nó vào archived_products bảng để tham khảo trong tương lai.

  2. Tiếp theo, xóa một sản phẩm khỏi products và xem liệu trình kích hoạt có được gọi hay không:

    DELETE FROM products WHERE product_id='3';
    
  3. Bây giờ, nếu bạn kiểm tra archived_products bảng, bạn sẽ thấy một bản ghi:

    SELECT * FROM archived_products;
    

    Đầu ra:

    +------------+--------------+------------+--------------+--------------+
    | product_id | product_name | cost_price | retail_price | availability |
    +------------+--------------+------------+--------------+--------------+
    |          3 | SMART WATCH  |      189.6 |        225.3 | LOCAL        |
    +------------+--------------+------------+--------------+--------------+
    1 row in set (0.00 sec)

Xóa trình kích hoạt

Bạn đã thấy các loại trình kích hoạt khác nhau và cách chúng có thể được sử dụng trong môi trường sản xuất. Đôi khi, bạn có thể muốn xóa trình kích hoạt khỏi cơ sở dữ liệu.

Bạn có thể xóa trình kích hoạt nếu không muốn sử dụng nữa bằng cú pháp bên dưới:

DROP TRIGGER IF EXISTS TRIGGER_NAME;
Lưu ý IF EXISTS từ khóa là một tham số tùy chọn chỉ xóa một trình kích hoạt nếu nó tồn tại.

Ví dụ:để xóa product_archiving kích hoạt mà chúng tôi đã xác định ở trên, sử dụng lệnh dưới đây:

DROP TRIGGER IF EXISTS product_archiver;

Đầu ra:

Query OK, 0 rows affected (0.00 sec)
Thận trọng Hãy thận trọng khi xóa các bảng được liên kết với trình kích hoạt. Khi một bảng bị xóa khỏi cơ sở dữ liệu MySQL, các trình kích hoạt liên quan cũng tự động bị xóa.

Thông tin khác

Bạn có thể muốn tham khảo các nguồn sau đây để biết thêm thông tin về chủ đề này. Mặc dù những điều này được cung cấp với hy vọng rằng chúng sẽ hữu ích, xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc kịp thời của các tài liệu được lưu trữ bên ngoài.

  • Cú pháp và ví dụ về trình kích hoạt MySQL

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO tìm nạp một cột từ bảng thành mảng 1 chiều

  2. Neo4j - Xóa mối quan hệ bằng Cypher

  3. Làm cách nào để nhận bản ghi mới nhất trong mỗi nhóm bằng cách sử dụng GROUP BY?

  4. Cách tính toán trung bình động trong MySQL

  5. Có thể sử dụng Biến do người dùng xác định MySql trong .NET MySqlCommand không?