INSERT INTO ... 重复更新所有值
INSERT INTO ... ON DUPLICATE UPDATE all values
我可以安全地更新所有值吗:
INSERT INTO tbl_name SET `a`=:a, `b`=:b, ... `z`=:z
ON DUPLICATE KEY UPDATE
`a`=VALUES(`a`), `b`=VALUES(`b`), ... `z`=VALUES(`z`);
我试过了,确实有效。但它只在一个 innodb table.
上测试过
我发现了这些相关问题 1, 2, 3 但没有提到更新所有列(唯一 and/or pk)是 100% 安全的。
使用相同的值更新 PK 时不会产生任何错误。
它不会在更新具有相同值的 Unique col 时产生任何错误。
那么,使用起来是100%安全的吗?如果不是,什么是极端情况,什么时候坏了?
---------- 编辑 --------------
添加 ... 最多 z col
INSERT INTO … ON DUPLICATE KEY UPDATE
是这样工作的:
- 它会像往常一样尝试插入一行
- 如果在任何列中发生任何约束冲突,它会在
INSERT
语句与之冲突的现有行上执行 UPDATE
语句
这只是意味着如果单独的 UPDATE
语句会成功,它的 ON DUPLICATE KEY UPDATE
等价物也会起作用。这意味着您显然也不能违反 UPDATE
语句中的任何约束,否则整个事情都会失败(例如,试图在另一行中已经存在的 UNIQUE
列上设置一个值)。
如果您再次在同一列上设置相同的值,那实际上是空操作。列中的值不会更改,因此也不会导致任何错误(假设您没有任何可能行为不端的非常时髦的 BEFORE UPDATE
触发器)。此处的列数无关紧要,您可以根据需要在一条语句中更改任意数量。
我可以安全地更新所有值吗:
INSERT INTO tbl_name SET `a`=:a, `b`=:b, ... `z`=:z
ON DUPLICATE KEY UPDATE
`a`=VALUES(`a`), `b`=VALUES(`b`), ... `z`=VALUES(`z`);
我试过了,确实有效。但它只在一个 innodb table.
上测试过我发现了这些相关问题 1, 2, 3 但没有提到更新所有列(唯一 and/or pk)是 100% 安全的。
使用相同的值更新 PK 时不会产生任何错误。
它不会在更新具有相同值的 Unique col 时产生任何错误。
那么,使用起来是100%安全的吗?如果不是,什么是极端情况,什么时候坏了?
---------- 编辑 --------------
添加 ... 最多 z col
INSERT INTO … ON DUPLICATE KEY UPDATE
是这样工作的:
- 它会像往常一样尝试插入一行
- 如果在任何列中发生任何约束冲突,它会在
INSERT
语句与之冲突的现有行上执行UPDATE
语句
这只是意味着如果单独的 UPDATE
语句会成功,它的 ON DUPLICATE KEY UPDATE
等价物也会起作用。这意味着您显然也不能违反 UPDATE
语句中的任何约束,否则整个事情都会失败(例如,试图在另一行中已经存在的 UNIQUE
列上设置一个值)。
如果您再次在同一列上设置相同的值,那实际上是空操作。列中的值不会更改,因此也不会导致任何错误(假设您没有任何可能行为不端的非常时髦的 BEFORE UPDATE
触发器)。此处的列数无关紧要,您可以根据需要在一条语句中更改任意数量。