2012-09-12 52 views
2

我有一个简单的查询,我试图转换为插入...重复键等,我遵循mysql指南,但由于某种原因,它不更新我的文字。但它确实成功地创建了新的行。任何帮助将不胜感激。查询的目的是添加和更新少量文本。MySQL插入到重复键查询没有更新

$sql = "INSERT INTO fetss.ocs_extended(ocsID, internalNOTE) 
      VALUES('" .(int)$_POST['id'] ."', '". $db- >quote($_POST['note_desc']) ."') 
      ON DUPLICATE KEY UPDATE internalNOTE = VALUES('". $db->quote($_POST['note_desc']) ."')"; 

要多liitle有点简单:

$sql = "INSERT INTO database.tablename(ID, Description) 
VALUES(ID, Description) on Duplicate Key Update Description = VALUES(Description)" 
+0

是您的ID设置为唯一指标? – Bill

回答

0

尝试:

$sql = sprintf("INSERT INTO fetss.ocs_extended(`ocsID`, `internalNOTE`) 
       VALUES(%d, '%s') 
       ON DUPLICATE KEY UPDATE 
       `internalNOTE` = VALUES(`internalNOTE`)", 
       (int)$_POST['id'], 
       $db->quote($_POST['note_desc'])); 

我以前sprintf使SQL有点更容易阅读,但由于要更新使用查询中的值描述,您不必指定值,只需通过指定该列名称告诉它使用插入语句中的值即可。

如果你想将其更新为一些任意字符串,你可以这样做:

INSERT INTO foo (id, desc) VALUES(1, 'testing') 
ON DUPLICATE KEY UPDATE 
desc = 'some other string that is not testing'; 

不同的是,你不使用VALUES功能这就是你的初始查询的问题了。

+0

感谢您的快速回复!当我运行这个查询虽然并更新我的文本字段,它实际上是一个新的行。所以我不知道那里发生了什么 – bubbles

+0

'ocsID'是'PRIMARY KEY'吗?如果不是,它必须是'UNIQUE'索引。 – drew010

+0

我的表中有3个主键,并且ocsID是其中的一个 – bubbles

0

使用REPLACE而不是INSERT

当您使用替换,如果已经存在一个重复的键行,MySQL的给定值将取代旧行值

+0

随着REPLACE,它首先删除行。你会得到一个新的自动ID等 –

+0

一个新的自动ID?我在11年里做了很多次,从未给我一个新的自动识别码。如果没有,是一个新的行!不要替换!是的文档说DELETES并插入一行与REPLACE语句中给出的数据,但没有提及有关自动增量列的新ID http://dev.mysql.com/doc/refman/5.0/en/replace。 html –

+0

我正在约会自己。这是在2005年修复:) http://bugs.mysql.com/bug.php?id=10795 –