【发布时间】:2012-08-13 18:55:33
【问题描述】:
我知道存在INSERT IGNORE 和INSERT ... ON DUPLICATE KEY UPDATE。但是,当有重复键时,我想对一个临时表做一个INSERT,以记录被违反的唯一键,以便我可以将其输出给用户。
我有什么办法可以做ON DUPLICATE INSERT 吗?如果有帮助,我正在尝试进行批量插入。
【问题讨论】:
标签: mysql sql insert on-duplicate-key
我知道存在INSERT IGNORE 和INSERT ... ON DUPLICATE KEY UPDATE。但是,当有重复键时,我想对一个临时表做一个INSERT,以记录被违反的唯一键,以便我可以将其输出给用户。
我有什么办法可以做ON DUPLICATE INSERT 吗?如果有帮助,我正在尝试进行批量插入。
【问题讨论】:
标签: mysql sql insert on-duplicate-key
使用ON DUPLICATE KEY UPDATE,您无法插入另一个表 - 也没有可用的替代函数。
您可以通过两种自定义/替代方式来完成此操作:
使用stored procedure,如该问题的公认答案中所述:MySQL ON DUPLICATE KEY insert into an audit or log table
创建一个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;
【讨论】:
也许这会有所帮助:
$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;
}
}
【讨论】: