2010-10-07 72 views
7

有没有办法做到这一点?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这个:(

谢谢!

+1

我猜“不”,除非你使用存储过程来执行此逻辑。 “ – 2010-10-07 17:53:14

回答

8

如果你要考虑使用存储过程,你可以使用一个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权限,以便数据库用户只能调用存储过程。

+0

存储过程或触发器(如MatTheCat提出的)将解决此问题,但大多数托管提供商不会接受服务器上的SP或触发器,不知道为什么,我猜想某种安全问题。 – ricardocasares 2010-10-07 18:08:36

+0

@ricardocasares:我会把它当作切换托管服务提供商的机会:) – 2010-10-07 18:13:31

+0

非常感谢Daniel!我会考虑切换主机;)并且非常感谢这个伟大的例子! – ricardocasares 2010-10-07 18:22:09

0

ON重复键用来更新该行,而不是在另一个表中插入,你必须根据第一的成绩使用两个查询

编辑:。你可以使用触发器太

+0

”您必须根据第一个结果使用两个查询。“ 你可以进一步解释一下,或者给我一个这样的例子吗? 非常感谢! – ricardocasares 2010-10-07 17:59:38

+0

忘记了这一点,你将不得不使用PHP ^^'使用触发器或尝试Daniel的解决方案。 – MatTheCat 2010-10-07 18:07:17

+0

感谢您的回复Mat;) – ricardocasares 2010-10-07 18:11:33

0

不知道这是否会工作,但考虑IF语句为MySQL

伪代码

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

谢谢Phill,我会试试看! – ricardocasares 2010-10-07 18:14:10

相关问题