8

我知道存在INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE。但是,当有重复键时,我想INSERT对一个临时表做一个记录,以记录被违反的唯一键,以便我可以将其输出给用户。

有什么办法可以做ON DUPLICATE INSERT吗?如果有帮助,我正在尝试进行批量插入。

4

2 回答 2

8

使用ON DUPLICATE KEY UPDATE,您不能插入到另一个表中 - 也没有可用的替代函数。

您可以通过两种自定义/替代方法来完成此操作:

  1. 使用stored procedure该问题的已接受答案中概述的:MySQL ON DUPLICATE KEY insert into an audit or log table

  2. 创建一个trigger将每个INSERT表记录到另一个表中并查询充满“日志”的表以查找任何重复项。

与此类似的东西应该可以工作:

CREATE TABLE insert_logs (
    id int not null
);

delimiter |
CREATE TRIGGER insert_logs_trigger BEFORE INSERT ON your_table
    FOR EACH ROW BEGIN
        INSERT INTO insert_logs SET id = NEW.id;
    END;
|

要获取表中重复项的列表,您可以:

SELECT id FROM insert_logs HAVING COUNT(id) > 1 GROUP BY id;
于 2012-08-13T19:07:55.930 回答
0

也许这可能会有所帮助:

$time = time();
$countme = 1;
while ($countme > 0) {
    $stmt = $mysqli->prepare("INSERT INTO loads (dte,filecode,id,acct,nmbr) VALUES (?,?,?,?,?) ON DUPLICATE KEY UPDATE dte = dte");
    $stmt->bind_param("sssss", $time, $filecode, $id, $acct, $number);
    $stmt->execute();
    $countme++;
    if ($stmt->affected_rows === 1) {
        $countme = 0; // all is good
    } else {
        $time = $time + 1;
    }
    if ($countme === 4) {
        exit;
    }
}
于 2020-02-08T00:20:17.893 回答