sql >> Databáze >  >> RDS >> Mysql

MySQL ON DUPLICATE KEY vložení do tabulky auditu nebo protokolu

Pokud chcete zvážit použití uložené procedury, můžete použít DECLARE CONTINUE HANDLER . Zde je příklad:

CREATE TABLE users (
    username    VARCHAR(30), 
    first_name  VARCHAR(30), 
    last_name   VARCHAR(30),
    PRIMARY KEY (username)
);

CREATE TABLE audit_table (timestamp datetime, description varchar(255));

DELIMITER $$
CREATE PROCEDURE add_user 
       (in_username    VARCHAR(30),
        in_first_name  VARCHAR(30),
        in_last_name   VARCHAR(30))
    MODIFIES SQL DATA
BEGIN
    DECLARE duplicate_key INT DEFAULT 0;
    BEGIN
        DECLARE EXIT HANDLER FOR 1062 SET duplicate_key = 1;

        INSERT INTO users (username, first_name, last_name)
               VALUES (in_username, in_first_name, in_last_name);
    END;

    IF duplicate_key = 1 THEN
        INSERT INTO audit_table VALUES(NOW(), 'Duplicate key ignored');
    END IF;
END$$
DELIMITER ;

Pojďme přidat nějaká data a pokusit se vložit duplicitní klíč:

CALL add_user('userA', 'Bob', 'Smith');
CALL add_user('userB', 'Paul', 'Green');
CALL add_user('userA', 'Jack', 'Brown');

Výsledek:

SELECT * FROM users;
+----------+------------+-----------+
| username | first_name | last_name |
+----------+------------+-----------+
| userA    | Bob        | Smith     |
| userB    | Paul       | Green     |
+----------+------------+-----------+
2 rows in set (0.00 sec)

SELECT * FROM audit_table;
+---------------------+-----------------------+
| timestamp           | description           |
+---------------------+-----------------------+
| 2010-10-07 20:17:35 | Duplicate key ignored |
+---------------------+-----------------------+
1 row in set (0.00 sec)

Pokud je audit důležitý na úrovni databáze, možná budete chtít udělit EXECUTE pouze oprávnění, takže uživatelé vaší databáze mohou volat pouze uložené procedury.



  1. Jak najdu vztahy mezi tabulkami, které se týkají dlouhé vzdálenosti? MySQL

  2. Kdy se výkon Distinct a Group By liší?

  3. Odstraňte duplicitní slova z pole v mysql

  4. Android Room – Práce se seznamem objektů v objektu a výsledkem dotazování