MySql - ON DUPLICATE KEY INSERT

时间:2012-08-13 18:55:33

标签: mysql sql insert on-duplicate-key

我了解存在INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE。但是,当存在重复键时,我想对临时表执行INSERT以保留已违反的唯一键的记录,以便我可以将其输出给用户。

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

2 个答案:

答案 0 :(得分:8)

使用ON DUPLICATE KEY UPDATE,您无法插入另一个表 - 也没有可用的替代功能。

您可以通过两种自定义/替代方式实现此目标:

  1. 使用此问题的接受答案中列出的stored procedureMySQL ON DUPLICATE KEY insert into an audit or log table

  2. 创建一个trigger,将您的表的每个INSERT记录到另一个表中,并查询表中包含任何重复项的“日志”。

  3. 类似的东西应该有效:

    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;
    

答案 1 :(得分: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;
    }
}