2012-05-13 85 views
10

我是MySQL新手,我想用新数组更新MySQL中的整行,到目前为止,Update查询的所有示例都涉及指定列名和一个新值列,如下所示:更新MySQL中的整个行

"UPDATE tablename SET columnname = '".$new_value."' WHERE columnname = '".$value."'"; 

如何使用更新查询更新整个记录,或者是否应该使用替换查询?

任何意见将不胜感激。

编辑:是否有一个查询不需要指定所有的列名和新的列值?

基本上我想有一个查询,看起来像这样:

更新entirerow与thisarray其中primarykeycolumn = 'thisvalue'

+2

感谢您的回答,我只是希望自己是一个较短的查询/ * *哭泣/ – grasshopper

回答

19

要做到这一点,你需要

  1. 枚举所有值
  2. 知道主键列和值

所以最终的查询看起来像

UPDATE tablename 
    SET col1 = 'val1', col2 = 'val2' ... 
WHERE id = id_value 

没有任何神奇的命令比上面显示我在SQL其他更新“整行”。而REPLACE绝对不是你在这里需要的。

+1

好感谢的话,我想我应该不要懒惰,并开始输入这些列。 – grasshopper

+0

标题专门说'MySQL'。除非你试图将他转换成Postgres,否则它并不适用于提及它:) – AlienWebguy

+0

@AlienWebguy:没有试图转换任何人。 MySQL在'WHERE'子句中允许使用这种语法:'WHERE(a,b)=(2,3)'在MySQL(通常是SQL)中是有效的。但它尚未在'SET'子句中实现。 –

8

这取决于您是否要保留该ID,假设ID为autoincrement

REPLACE INTO mytable VALUES(new array) ....也会更新ID,因为它实际上只是模拟DELETEINSERT

如果你想保留ID,使用UPDATE mytable SET foo='bar', baz='bat' WHERE id=12

作为一个仅供参考,REPLACE是映射表,其中唯一的字段或复合主键不是自动增量一般方便。

+2

当有外键指向这个表时(特别是在定义了ON DELETE CASCADE动作时),使用'REPLACE'也不好。 –

+0

是的不幸的是,id是autoincrement,我需要保持这些 – grasshopper

2

您当然可以在一个查询中完成所有操作。您只需添加更多this =逗号分隔的句子:

"UPDATE tablename 
SET column1name = '".$new_value1."', 
    column2name = '".$new_value2."', 
    column3name = '".$new_value3."' 
WHERE columnname = '".$value."'" 
2

这是正确的方法。

UPDATE TABLENAME SET COLUMNAME = VALUE, COLUMN2NAME = VALUE, ETC WHERE CONDITION 
+3

“正确”是主观的。 – AlienWebguy

-2

是有一个类似的方式...

$updateSQL = sprintf("UPDATE hotel <br>SET hotel_name=%s, contact_person_1=%s <br>WHERE hotel_id=%s",<br> 
         $_POST['hotel_name'],<br> 
         $_POST['contact_person_1'],<br> 
         $_POST['hotel_id']); 

mysql_select_db($database_hotelbookingryan, $hotelbookingryan); 
$Result1 = mysql_query($updateSQL, $hotelbookingryan) or die(mysql_error());