mysql - PHP - MySQL INSERT - 发现一个错误后会取消查询的其余部分吗?

标签 mysql insert

我制定了一种算法,可以创建包含数千个插入的 MySQL INSERT QUERY:

它看起来像这样:

-- (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

它会在那里停止查询并让其他插入漂浮在空间中吗?我必须截断表并重新开始,而不知道是谁造成了问题:/

最佳答案

如果其中一个插入有错误,会发生什么情况?例如:*

该语句停止执行,并且正在进行的任何更改都将被撤消。 (但是,失败的插入可能会产生一些副作用...例如,表上的 AUTO_INCRMENT(如果有的话)可能会高于 INSERT 语句开始时的值。此外,为每个表触发的 BEFORE INSERT 触发器行可能对 MyISAM 表进行了 DML 更改,这些更改不会被“撤销”。

但是就插入到目标表中的行而言,INSERT 失败的行都不存在。

它会在那里停止查询吗

是的,INSERT 将引发错误,并且该语句所做的任何更改都会被还原。

并让其他插入物漂浮在空间中?

太空中不会再有任何漂浮物。整个语句要么成功,要么失败。要么插入所有行,要么不插入任何行。

该过程如何进行取决于您是继续下一个 INSERT 语句还是停止处理。

(我在这里讨论的是插入多行的单个 INSERT 语句。而不是讨论其他语句会发生什么情况。之前成功的语句仍然是成功的。(在TRANSACTION,使用InnoDB(或其他支持事务的存储引擎),可以发出ROLLBACK并“撤消”更改。如果您使用MyISAM存储引擎,ROLLBACK不会有任何效果,成功声明已提交。

我必须截断表并重新开始,而不知道是谁造成了问题:/

您不一定需要截断表。这可能是您想要用来重新启动加载过程的方法,这取决于您。就MySQL而言,所有成功完成的INSERT语句都会被存储。您只需从失败的 INSERT 语句重新启动即可。


需要考虑的一些事项:

如果您不需要插入“无效”行,但需要插入其他行,则可以使用 INSERT IGNORE 语句。

IGNORE 告诉 MySQL 在插入特定行失败时不要引发错误。 MySQL 继续运行该语句并允许其成功完成,但会出现警告,而不是错误。

如果您插入了 1000 行,其中一行有错误,则会收到警告,并且将插入其他 999 行。

对于批量加载巴西行,没有什么比 LOAD DATA 语句更好的了。

如果你走巴西人插入语句的路线,那么MySQL服务器上将需要做更多的工作,解析语句,生成执行计划,获取锁,返回状态...... INSERT是相当多的高效的流程,但处理每个单独语句的所有开销都会增加。因此,这不仅会变得非常慢,而且还会通过无情且令人痛苦的逐行处理对 MySQL 服务器造成冲击。

关于mysql - PHP - MySQL INSERT - 发现一个错误后会取消查询的其余部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26169048/

相关文章:

php - while 循环仅返回 1 个产品行

html - MySQL 更新查询以从所有 "description"字段中删除特定的 Html 标记

java - CREATE TABLE 不影响 JBDC

MySQL LAST_INSERT_ID() 由于 AUTO_INCRMENT 而未更新

php - INSERT 语句不适用于 PHP 代码,但适用于 Phpmyadmin

php - 建立评级系统 : database structure involve user_id?

mysql - 不正确的整数值 : '' for column

mysql - SqlParameterCollection 只接受非空 SqlParameter 类型对象,而不接受 MySqlParameter 对象

mysql - 如何在SQL中选择表中不存在的记录?

MYSQL 在不切断中间字的情况下修剪字符串