Intereting Posts
Почему php-итерация по ссылке возвращает дубликат последней записи? Добавление сеттеров и Getters в модель Laravel Должен ли я использовать mysqli_real_escape_string или использовать подготовленные инструкции? PHP: Как использовать set_error_handler () для правильной обработки всех ошибок, кроме уведомлений? ejabberdctl не работает с PHP хотите вставить загруженный файл csv в базу данных. он говорит «не выбрана база данных», что я пропустил? php-константы в файле javascript Magento 1.6: Использование MySQL datetime-полей с ресурсами моделей Как загрузить файл в базу данных mysql на общей платформе хостинга? PHP не может найти драйвер MongoDB Поведение PHP ltrim с символьным списком Обнаружение имен параметров в php-функции для короткого кода WordPress? PHP cURL, запись в файл __autoload не может выдать исключение, если он не загружает класс при вызове статического метода Неустранимая ошибка: исключить исключение «Zend_Gdata_App_HttpException» с сообщением «Ожидаемый код ответа 200, получил 401»

Включение MySQL ON DUPLICATE KEY в таблицу аудита или журнала

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

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 только для того, чтобы пользователи базы данных могли вызывать только хранимые процедуры.

    ON DUPLICATE KEY используется для обновления строки, а не для вставки в другую таблицу, вам нужно использовать два запроса в соответствии с результатом первого.

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

    Не уверен, что это сработает, но посмотрите на инструкцию IF для MySQL

    Псевдо-код

     IF(SELECT id_key_index FROM tbl WHERE id_key_index = $index) THEN (UPDATE SECOND TBL); ELSE INSERT ... END IF;