MySQL INSERT ...在重复键更新和忽略时

标签 mysql

我正在向 MySQL 输入大量数据,这些数据经常更新(基于唯一索引)。

给出以下语句...

INSERT INTO 'players' ('id', 'parent', 'child_name')
VALUES
('1', '100', 'john'),
('2', '200', 'bob'),
('3', '300', 'chris')
ON DUPLICATE KEY UPDATE `parent` = VALUES(`parent`), `child_name` = 
VALUES(`child_name`), `id` = VALUES(`id`)

在某些情况下,提要不正确且父级不存在,因此失败并出现错误...

无法添加或更新子行:外键约束失败

我想知道的是,它是在这个 bulk upsert 上插入好行还是整个语句失败,如果是这样,我需要添加 ignore 到确保它有效?

提前致谢

最佳答案

带有 innodb 的 MySql(可能是您的引擎)是 ACID。默认情况下,Innodb 上的所有插入语句都是自动完成的,这意味着如果语句的任何部分失败,则不会发生插入。

您可以使用 IGNORE 并且任何失败的值集都将被完全跳过,但是我不推荐这样做,因为它会默默地隐藏任何其他错误(其他您可能不会想到的)。为什么不在插入前验证记录是否满足约束?

同样,您可以更改交易设置并插入交易:https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html .但是,老实说,我从来没有这样做过,所以我不确定如果几行失败会怎样。失败的那个之后剩下的会停止插入吗?

关于MySQL INSERT ...在重复键更新和忽略时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49090132/

相关文章:

php - 如何处理混合使用 HTML 和标点符号的用户输入?

mysql - 如何使用 SQL 查找丢失的数据行?

java - 插入记录时在 JDBC Java 中出错

mysql - 考勤系统MongoDB设计

java - 列索引超出范围,3 > 2。嵌套异常是 java.sql.SQLException :

mysql - SQL Join 只返回 1 行

php - MYSQL 出现这个错误

mysql - Pomelo MySql .net core 2 - 默认执行超时

MySQL - 条件 WHERE

php - MySQL数据库插入错误