我知道存在INSERT IGNORE
和INSERT ... ON DUPLICATE KEY UPDATE
。但是,当有重复键时,我想INSERT
对一个临时表做一个记录,以记录被违反的唯一键,以便我可以将其输出给用户。
有什么办法可以做ON DUPLICATE INSERT
吗?如果有帮助,我正在尝试进行批量插入。
我知道存在INSERT IGNORE
和INSERT ... ON DUPLICATE KEY UPDATE
。但是,当有重复键时,我想INSERT
对一个临时表做一个记录,以记录被违反的唯一键,以便我可以将其输出给用户。
有什么办法可以做ON DUPLICATE INSERT
吗?如果有帮助,我正在尝试进行批量插入。
使用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;
}
}