【问题标题】:ON DUPLICATE KEY UPDATE ... with WHERE or subselection?ON DUPLICATE KEY UPDATE ... 带有 WHERE 或子选择?
【发布时间】:2010-12-20 10:32:00
【问题描述】:

我有点担心我的一个 mysql 查询...以下查询接收变量 $DB_id...如果具有该主键的行已经存在,则查询执行更新。

$this->db->query("  INSERT INTO         modules_text 
                                            (   module_id,
                                                module_content,
                                                module_index
                                            )

                        VALUES              (   '{$DB_id}',
                                                '{$content['text']}',
                                                '{$index}'
                                            )

                        ON DUPLICATE KEY
                        UPDATE            module_content    = '{$content['text']}',
                                        module_index      = '{$index}'

                    ");

现在让我担心的事情... 如果受影响的行实际上属于用户,则没有关系。我想在 UPDATE 部分添加一个 where 语句,或者首先对允许受影响的行进行子选择。类似的东西:

[...]
            ON DUPLICATE KEY
            UPDATE            module_content    = '{$content['text']}',
                            module_index      = '{$index}'
            WHERE            module_post_id    = '{$post]}'

这是否可能...直到现在我还没有找到解决方案...任何帮助将不胜感激...非常感谢!!!!!!

Saludos Sacha!

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这不是 ON DUPLICATE KEY 的工作方式。仅当表的唯一键或主键匹配时,INSERT 的更新部分才会发生。 (即:UNIQUE/PRIMARY 键实际上是 WHERE 子句。)

    查看完整的MySQL docs 了解更多信息。

    【讨论】:

    • 我知道...但是 id 由客户端传递...因此用户可以尝试修改这些密钥...在我的情况下,这在某种程度上是不安全的...
    • @Bosh - 这不是 MySQL 的错。如果您直接从查询字符串中传递数据库 ID,那么这就是您的设计缺陷。 (为什么不存储一个唯一的文本模块引用并使用它呢?)
    • 我知道 ;-) 由于该设计缺陷,我正在寻找解决方案 ;-) 实际上我已经混淆了 id 以使其更安全,但由于性能,它不是最强大的算法之一...你是什么意思与独特的文本模块参考...我用谷歌搜索但没有找到解释...谢谢!
    • @Bosh 不使用 ID,而是使用文本引用(例如:“testmodule”)并将此引用与 ID 一起存储在数据库表中。因此,您不必查找 ID,而是查找文本名称,这与 ID 不同,不容易猜到。
    • 嗯...好吧,我明白了...如果我找不到更简单的解决方案,我会尝试一下。我有点担心这会如何影响通过文本 id 而不是数字 id 选择的性能......此外,我已经拥有必要的数据来确保它的安全,我只需要找到处理它的最佳方法。添加另一列应该是最后的选择......正如你提到的它的设计缺陷不是缺少数据;-)所以我应该首先尝试修改我的查询而不是数据;-)非常感谢......跨度>
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多