sql >> Database teknologi >  >> RDS >> Mysql

MySQL ON DUPLICATE KEY indsættes i en revisions- eller logtabel

Hvis du vil overveje at bruge en lagret procedure, kan du bruge en DECLARE CONTINUE HANDLER . Her er et eksempel:

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 ;

Lad os tilføje nogle data og prøve at indsætte en dubletnøgle:

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

Resultat:

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)

Hvis revision er vigtig på databaseniveau, kan du give EXECUTE kun tilladelser, så dine databasebrugere kun kan kalde lagrede procedurer.



  1. forskel mellem primær nøgle og unik nøgle

  2. Hvordan genstarter man en ekstern MySQL-server, der kører på Ubuntu linux?

  3. Talk-dias:Partitioneringsforbedringer i PostgreSQL 11

  4. Hvad er PDO-ækvivalenten til funktionen mysql_real_escape_string?