有沒有辦法做到這一點?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這個:(
謝謝!
有沒有辦法做到這一點?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
權限,以便數據庫用戶只能調用存儲過程。
存儲過程或觸發器(如MatTheCat提出的)將解決此問題,但大多數託管提供商不會接受服務器上的SP或觸發器,不知道爲什麼,我猜想某種安全問題。 – ricardocasares 2010-10-07 18:08:36
@ricardocasares:我會把它當作切換託管服務提供商的機會:) – 2010-10-07 18:13:31
非常感謝Daniel!我會考慮切換主機;)並且非常感謝這個偉大的例子! – ricardocasares 2010-10-07 18:22:09
ON重複鍵用來更新該行,而不是在另一個表中插入,你必須根據第一的成績使用兩個查詢
編輯:。你可以使用觸發器太
」您必須根據第一個結果使用兩個查詢。「 你可以進一步解釋一下,或者給我一個這樣的例子嗎? 非常感謝! – ricardocasares 2010-10-07 17:59:38
忘記了這一點,你將不得不使用PHP ^^'使用觸發器或嘗試Daniel的解決方案。 – MatTheCat 2010-10-07 18:07:17
感謝您的回覆Mat;) – ricardocasares 2010-10-07 18:11:33
不知道這是否會工作,但考慮IF語句爲MySQL
僞代碼
IF(SELECT id_key_index FROM tbl WHERE id_key_index = $index) THEN (UPDATE SECOND TBL);
ELSE
INSERT ...
END IF;
謝謝Phill,我會試試看! – ricardocasares 2010-10-07 18:14:10
我猜「不」,除非你使用存儲過程來執行此邏輯。 「 – 2010-10-07 17:53:14