Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在审计或日志表中插入重复密钥的MySQL_Php_Mysql_Mysql Error 1062 - Fatal编程技术网

Php 在审计或日志表中插入重复密钥的MySQL

Php 在审计或日志表中插入重复密钥的MySQL,php,mysql,mysql-error-1062,Php,Mysql,Mysql Error 1062,有没有办法做到这一点 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用于此:( 谢谢!如果重复键用于更新行,而不是插入到另一个表中,则必须根据第一个表的结果使用两个查询 编辑:您可以使用触发器“”。如果您想考虑使用存储过程,可以使用A。这里有一个

有没有办法做到这一点

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用于此:(


谢谢!

如果重复键用于更新行,而不是插入到另一个表中,则必须根据第一个表的结果使用两个查询


<>编辑:您可以使用触发器“

”。如果您想考虑使用存储过程,可以使用A。这里有一个例子:

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语句

伪码

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

我猜“不”,除非您使用存储过程来执行此逻辑。“您必须根据第一个结果使用两个查询。”您能进一步解释一下或给我一个例子吗?非常感谢!忘记了这一点,您必须使用PHP^^'使用触发器或尝试Daniel的解决方案。感谢您的回复;)存储过程或触发器(如MatTheCat所建议的)将解决此问题,但大多数托管提供商不会在其服务器上接受SP或触发器,不知道为什么,我猜是某种安全问题。@ricardocasares:我会将此视为切换托管提供商的机会:)非常感谢Daniel!!我会考虑切换主机;非常感谢这个伟大的例子!谢谢你,菲尔,我来试试!