【问题标题】:Can I use ON DUPLICATE KEY UPDATE with an INSERT query using the SET option?我可以在使用 SET 选项的 INSERT 查询中使用 ON DUPLICATE KEY UPDATE 吗?
【发布时间】:2011-11-28 21:41:33
【问题描述】:

我看到了以下内容(使用 VALUES 选项):

$query = "INSERT INTO $table (column-1, column-2, column-3) VALUES ('value-1', 'value-2', 'value-3') ON DUPLICATE KEY UPDATE SET column1 = value1, column2 = value2, column3 = value3, ID=LAST_INSERT_ID(ID)"; 

...但我不知道如何将 ON DUPLICATE KEY UPDATE 添加到我正在使用的内容中:

$query = "INSERT INTO $table SET
    column-1 ='value-1',
    column-2 ='value-2',
    column-3 ='value-3'
";

例如:,伪代码

$query = "INSERT INTO $table SET
    column-1 ='value-1',
    column-2 ='value-2',
    column-3 ='value-3'
    ON DUPLICATE KEY UPDATE SET
    column1 = value1,
    column2 = value2,
    column3 = value3,
    $id=LAST_INSERT_ID(id)"; 
    $my_id = mysql_insert_id();
";

我会发现后者更容易阅读。希望澄清一下,在手册中没有找到示例。

干杯

【问题讨论】:

    标签: php mysql key duplicates


    【解决方案1】:

    我经常使用ON DUPLICATE KEY UPDATE。在某些情况下,真正值得使用的是非标准 SQL 扩展。

    首先,您需要确保有一个唯一的键约束。 ON DUPLICATE KEY UPDATE 函数仅在存在唯一密钥违规的情况下才会启动。

    这是一种常用的格式:

     $query = "INSERT INTO $table (column1, column2, column3)
     VALUES ('value-1', 'value-2', 'value-3')
     ON DUPLICATE KEY UPDATE
     column1 = values(column1),
     column2 = values(column2),
     column3 = values(column3);"
    

    column1 = values(column1) 表示“如果查询没有遇到重复键违规,则使用将插入的值更新 column1。”换句话说,它只是意味着将 column1 更新为插入工作时的样子。

    查看此代码,您要更新您尝试插入的所有三个列似乎并不正确。哪一列有唯一的约束?

    编辑:根据 OP 的问题,根据 mysql insert 语句的“SET”格式进行修改。

    基本上要使用ON DUPLICATE KEY UPDATE,您只需像往常一样编写插入语句,但在末尾添加ON DUPLICATE KEY UPDATE 子句。我相信它应该像这样工作:

    INSERT INTO $table 
        set column1 = 'value-1',
            column2 = 'value-2',
            column3 = 'value-3'
    ON DUPLICATE KEY UPDATE
        column1 = values(column1),
        column2 = values(column2),
        column3 = values(column3);
    

    同样,您要插入的列之一必须具有唯一索引(或列的组合)。这可能是因为其中一个是主键,也可能是因为表上有唯一索引。

    【讨论】:

    • 谢谢凯文。我的 ID 列是主键并且具有唯一索引。我相信我了解 ON DUPLICATE KEY 的工作原理,但我的问题是将其添加到不同的 INSERT 语法中,使用 SET 而不是 VALUES。如果可行,我想看看该语法的示例。
    • 并澄清一下:我想使用 ON DUPLICATE KEY UPDATE 来防止在刷新时添加欺骗,尽管我使用标题将用户重定向到结果页面但我不能阻止用户去返回并重新提交...所以是的,如果 ID 存在,我想我会更新所有字段
    • 我已经修改了示例以使用您所询问的格式,至少我认为我做到了!
    • 再次感谢您。我一直在努力使这项工作好几天,但我做不到。我对 ON DUPLICATE KEY UPDATE 的理解是非常错误的,或者我的流程中有问题。我将编辑我的问题或重新发布更多上下文。谢谢
    • 您是否介意接受这个答案,或许可以将您的代码及其生成的错误的副本发送给我?
    【解决方案2】:

    【讨论】:

    • 谢谢凯末尔。 REPLACE 似乎也是一种合适的方法,但是 REPLACE 和 ON DUPLICATE KEY UPDATE 之间的区别对我来说还不完全清楚。我会阅读 REPLACE。
    • 附言。我的理解是,REPLACE 可能会以不受欢迎的方式破坏索引,所以我将尝试使 ON DUPLICATE KEY UPDATE 工作。再次感谢凯末尔
    • 在此处查看有关替换的详细信息stackoverflow.com/questions/4205181/…
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多