Есть ли способ сделать это?
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;