【发布时间】:2015-11-17 17:36:26
【问题描述】:
我可以像这样安全地更新所有值吗:
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 表上进行了测试。
我发现了这些相关问题1、2、3,但没有提到更新所有列(唯一和/或 pk)是 100% 安全的。
更新具有相同值的 PK 不会产生任何错误。
更新具有相同值的唯一 col 不会产生任何错误。
那么,使用它是否 100% 安全?如果不是,什么是极端情况,什么时候会破裂?
--------- 编辑 -------------
添加...最多z col
【问题讨论】:
-
为什么需要使用当前值更新所有字段?
-
我永远不会那样做!有些字段可能有新值,有些则没有。除了PK,任何领域都可以有新的价值。所有字段都可以有新值,或者只有一个字段可以有新值。基本上,它的工作原理类似于 pdo-db->save() 函数。
-
只更新具有新值的字段有什么问题?
-
因为我不知道什么时候以及哪些字段会有新的值。目前大约有 20 个字段,所有用户都可以更改。未来还会有更多的领域。我的 save() 方法有效。我只想知道它是否 100% 安全。
-
您当前的代码所做的是更新表,然后如果唯一的键约束触发器使用其当前值更新所有字段。这是没有意义的,你可以只更新一个而不是全部,这仍然是一个 hack,但不幸的是,这是安全地做你想做的事情的唯一方法(afaik)。所以是的,这是安全的,你也不需要
VALUES。
标签: php mysql insert on-duplicate-key