我创建了一个算法,该算法使用数千个插入创建了一个MySQL插入查询:
看起来是这样的:
-- (id, title, cost, price)
INSERT INTO products VALUES
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
-- ... AND THOUSANDS MORE如果其中一个插入有错误,会发生什么情况;例如:
-- (id, title, cost, price)
INSERT INTO products VALUES
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
(null, "product title", INVALID_VALUE_THAT_CANT_BE_INSERTED, 6000),
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
(null, "product title", 3000, 6000),
-- ... AND THOUSANDS MORE它会停止查询并让其他插入在空间中浮动吗?我将不得不截断表,然后重新开始,而不知道是谁造成了问题:/
发布于 2014-10-02 21:07:01
如果其中一个插入有错误会发生什么;例如:*
语句将停止执行,并且正在进行的任何更改都将被撤消。(但是,失败的插入可能会产生一些副作用.例如,表上的AUTO_INCREMENT (如果有)可能高于INSERT语句开始时的值。此外,在为每一行触发INSERT触发器对MyISAM表进行DML更改之前,这些更改不会“退出”。
但是,就插入到目标表的行而言,插入失败的行都不会出现。
会停止查询吗?
是的,插入将引发错误,由该语句所做的任何更改都将被恢复。
并让其他插入在空间中浮动?。
不会有任何东西漂浮在太空里。整个语句要么成功,要么失败。要么所有行都将被插入,要么所有行都不会被插入。
这取决于进程如何进行,是否继续使用下一个INSERT语句,或者是否停止处理。
(我在这里讲的是插入多行的单个INSERT语句的上下文。而不是关于其他陈述会发生什么。以前成功的声明仍然成功。(在事务上下文中,使用InnoDB (或支持事务的其他存储引擎)可以发出回滚并“撤消”更改。如果您使用的是MyISAM存储引擎,回滚不会有任何效果,一个成功的语句已经提交。
,我将不得不截断表,然后重新启动,而不知道是谁导致了问题:/
您不一定需要截断表。这可能是您希望使用的重新启动加载进程的方法,这取决于您。就MySQL而言,成功完成的所有INSERT语句都被存储。只需从失败的INSERT语句重新启动即可。
有些事情需要考虑:
如果不需要插入“无效”行,但需要插入其他行,则可以使用INSERT IGNORE语句。
IGNORE告诉MySQL不要在特定行的插入失败时引发错误。MySQL继续运行该语句,并允许它成功地完成,并带有警告,而不是错误。
如果插入了一千行,而一行有错误,则会有警告,而其他999行将被插入。
对于大量加载一行的巴西人,没有什么比LOAD DATA语句更好了。
如果您使用巴西的单个inserts语句的路线,那么在MySQL服务器、解析语句、生成执行计划、获取锁、返回状态等方面都需要做大量的工作.INSERT是一个相当有效的过程,但是处理每个语句的所有开销加在一起就会增加。因此,这不仅速度慢得令人痛苦,而且还将对MySQL服务器造成无情和令人痛苦的逐行处理。
https://stackoverflow.com/questions/26169048
复制相似问题