我了解存在INSERT IGNORE
和INSERT ... ON DUPLICATE KEY UPDATE
。但是,当存在重复键时,我想对临时表执行INSERT
以保留已违反的唯一键的记录,以便我可以将其输出给用户。
有什么方法可以ON DUPLICATE INSERT
吗?如果它有帮助,我正在尝试进行批量插入。
答案 0 :(得分:8)
使用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;
答案 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;
}
}