【问题标题】:MySql - ON DUPLICATE KEY INSERTMySql - 重复键插入
【发布时间】:2012-08-13 18:55:33
【问题描述】:

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

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

【问题讨论】:

标签: mysql sql insert on-duplicate-key


【解决方案1】:

使用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;

【讨论】:

    【解决方案2】:

    也许这会有所帮助:

    $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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 2012-07-14
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多