MySQL на дублирующем ключевой вставку в таблицу аудита или журнала

StackOverflow https://stackoverflow.com/questions/3884344

  •  28-09-2019
  •  | 
  •  

Вопрос

Есть ли способ сделать это?

INSERT IGNORE INTO some_table (one,two,three) VALUES(1,2,3)
ON DUPLICATE KEY (INSERT INTO audit_table VALUES(NOW(),'Duplicate key ignored')

Я действительно не хочу использовать PHP для этого :(

Спасибо!

Это было полезно?

Решение

Если вы хотите рассмотреть возможность использования сохраненной процедуры, вы можете использовать DECLARE CONTINUE HANDLER. Отказ Вот пример:

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 ;

Давайте добавим некоторые данные, пытаясь вставить дубликатную клавишу:

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

Результат:

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)

Если аудит важен на уровне базы данных, вы можете предоставить EXECUTE Разрешения только так, чтобы пользователи вашей базы данных могут позвонить только сохраненным процедурам.

Другие советы

На дублирующем ключе используется для обновления строки, не вставляйте в другую таблицу, вы должны использовать два запроса в соответствии с результатом первого.

Редактировать: вы можете использовать триггер тоже

Не уверен, будет ли это работать, но посмотреть, если заявление для MySQL

Псевдокод

IF(SELECT id_key_index FROM tbl WHERE id_key_index = $index) THEN (UPDATE SECOND TBL);
    ELSE
      INSERT ...
    END IF;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top