我有一张3列的表。每个都有一个唯一的索引。当不允许重复时,MySQL会多次插入。
我想一次做多个插入(300条记录弹出)。当出现重复条目时,它将取消整个插入。这意味着如果300中有1个是重复的,则不会插入它们。
有没有办法解决这个问题?
我有一张3列的表。每个都有一个唯一的索引。当不允许重复时,MySQL会多次插入。
我想一次做多个插入(300条记录弹出)。当出现重复条目时,它将取消整个插入。这意味着如果300中有1个是重复的,则不会插入它们。
有没有办法解决这个问题?
尝试将您的查询从INSERT INTO ...
更改为INSERT IGNORE INTO ...
。这会导致任何错误成为警告,并且应插入其他记录。
使用事务:http://dev.mysql.com/doc/refman/5.0/en/commit.html
START TRANSACTION
// DO QUERIES
COMMIT
如果在任何中进行查询出错,没有记录将被提交。
如果你想忽略错误。从你的mysql命令行使用--force
我认为OP想要的是相反的......他正在做一个多重插入,并且整个插入语句由于一个错误的记录而死亡。 – 2012-02-13 18:10:44
我已更新我的回答以反映此问题。 – 2012-02-13 18:14:26
如果你的插入是幂等的,update or replace
会帮助你。
鉴于它们很可能没有,所以没有任何超级有效的方法可以做到这一点,而不会退回到插入单独的行作为回退 - 以隔离问题行。
如果您正在批量插入以减少客户端到服务器的延迟,请考虑使用stored procedure获取行,并在服务器端插入一次获取所有数据;可以有一个后备,逐行地进行适当的错误处理。
当然,假设在服务器端可以完成一些有意义的错误处理,而无需与客户端进行同步通信。
您可以使用这样的事情:
INSERT INTO table (username, id)
VALUES
('john', 1),
('jim', 2),
('mary', 3),
('jack', 4),
('helen', 4) ON DUPLICATE KEY IGNORE
如果要被替换的条目,使用UPDATE而不是忽略不计。
MySQL没有'ON DUPLICATE KEY IGNORE'。它只支持'ON DUPLICATE KEY UPDATE'。 – 2012-02-13 18:19:07
谢谢,去了这个。似乎工作得很好。 – Steve 2012-02-14 00:01:46