2011-10-01 79 views
5

我看到以下(使用VALUES选项):使用SET选项可以使用ON DUPLICATE KEY UPDATE和INSERT查询吗?

$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)"; 

...但我想不出如何对重复密钥更新添加到什么我使用:

$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(); 
"; 

我会觉得后者更容易阅读。希望澄清,没有在手册中找到一个例子。

欢呼

回答

14

我用ON DUPLICATE KEY UPDATE了很多。对于某些情况,它是非常值得使用的非标准SQL扩展。

首先,您需要确保您具有唯一的密钥约束。 ON DUPLICATE KEY UPDATE函数仅在发生唯一密钥违例时才会执行。

这里有一个常用的格式:“更新COLUMN1与假若该查询没有命中重复键冲突已插入值”

$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更新为插入的工作内容。

看看这段代码,你要更新所有你试图插入的三列似乎不太正确。哪些列对其有独特的约束?

编辑:修改基于'SET'格式的MySQL插入语句每个问题从OP。

基本上使用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); 

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

+0

谢谢凯文。我的ID列是主键,具有唯一索引。我相信我理解ON DUPLICATE KEY是如何工作的,但是我的问题是将它添加到不同的INSERT语法中,一个使用SET而不是VALUES。如果可行,我希望看到该语法的一个例子。 – shecky

+0

只是为了澄清:我想使用ON DUPLICATE KEY UPDATE来防止在刷新时添加模糊,尽管我使用标题将用户重定向到结果页面,但我无法阻止用户返回并重新提交。 。所以是的,我想我会更新所有字段,如果ID存在 – shecky

+0

我修改了示例以使用您问的格式,至少我想我是这样做的! –

1
+0

谢谢凯末尔。 REPLACE似乎也是一种合适的方法,但REPLACE&ON DUPLICATE KEY UPDATE之间的区别还不完全清楚。我会阅读REPLACE。 – shecky

+0

P.s.我的理解是,REPLACE可能会以不受欢迎的方式使用索引,所以我将尝试使ON DUPLICATE KEY UPDATE工作。 Thx再次凯末尔 – shecky

+0

看到详细信息关于替换这里http://stackoverflow.com/questions/4205181/insert-to-table-or-update-if-exists-mysql – frazras

相关问题