我之前在IGNORE
次查询中使用了mysql
我通常会在尝试插入mysql
时使用它来避免duplicate key
返回错误,但是我我不确定这是如何工作的 - mysql在使用IGNORE
时是忽略错误还是只忽略duplicate key
错误?
因此,例如,如果发生deadlock
,在查询中使用IGNORE
时仍然会发出错误吗?
修改
进行更多阅读并找到此信息:
如果使用IGNORE关键字,则忽略执行INSERT语句时出现的错误。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,语句中止。使用IGNORE,该行将被丢弃并且不会发生错误。虽然重复键错误没有,但忽略错误可能会生成警告。
嗯,我想这意味着死锁错误只会产生警告呢?
答案 0 :(得分:1)
IGNORE
关键字仅忽略重复键错误,并且不会插入具有重复键的这些行,而是没有错误的其他行。将生成警告。
如果并发 INSERT
如果某个其他线程锁定了“唯一值”集,那么您的线程将等待锁释放并超出死锁/锁等待超时错误。
在这种情况下,不会插入任何行(该语句)并返回ERROR
有桌子:
CREATE TABLE `t` (
`id` INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;
现在同时运行这两个查询:
INSERT IGNORE INTO t(id)
VALUES (5+sleep(1)),(6+sleep(1)),(3+sleep(1)),(4+sleep(1));
/* Affected rows: 4 Found rows: 0 Warnings: 0 Duration for 1 query: 4,586 sec. */
INSERT IGNORE INTO t(id)
VALUES (3+sleep(1)),(4+sleep(1)),(5+sleep(1)),(6+sleep(1));
/* SQL Error (1213): Deadlock found when trying to get lock; try restarting transaction */
/* Affected rows: 0 Found rows: 0 Warnings: 0 Duration for 0 of 1 query: 0,000 sec. */