开启DUPLICATE KEY UPDATE工作

时间:2011-11-10 12:21:26

标签: php mysql

我有一个名为reports的表单和数据库表。我有一个date字段(主键)和一个名为changes的textarea来说明该日期的更改内容。如果日期相同,我希望能够覆盖该日期“更改”列中的信息。

我自己的插入命令如下:

mysql_query("
  INSERT INTO reports (thedate,changes)
    VALUES ('$_POST[thedate]','$_POST[changes]')
");

我理解我需要在ON DUPLICATE KEY UPDATE之后使用INSERT,但经过多次尝试后我无法正确行事。事情不仅没有更新,而且似乎打破了我的插入命令,所以即使没有新的行添加到数据库中。

如果这是一个重复的问题,请道歉。经过大量的搜索和大量的尝试,我无法让它发挥作用。

3 个答案:

答案 0 :(得分:3)

看看REPLACE

  

REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中   table与PRIMARY KEY或UNIQUE的新行具有相同的值   index,在插入新行之前删除旧行。

请注意,如果您的外键带有操作ON DELETE,则在使用REPLACE时会触发该操作,因为它执行删除后跟插入< / em>。


使用ON DUPLICATE KEY可能如下所示:

INSERT reports (thedate, changes) VALUES ('$_POST[thedate]', '$_POST[changes]')
  ON DUPLICATE KEY UPDATE changes = '$_POST[changes]'

答案 1 :(得分:2)

这是纯SQL查询:

INSERT INTO reports (thedate, changes)
VALUES ('2011-11-10', 'Lorem ipsum')
ON DUPLICATE KEY UPDATE changes=VALUES(changes)

http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

现在,您绝对需要坐下来尝试了解SQL是什么以及它如何与PHP交互并与之不同。您正在使用PHP来编写恰好是来自另一种称为SQL的语言的代码的字符串。你这样做的方式,生成的代码可以是有效的SQL,也不依赖于任何匿名访问者发送的任意数据。在最好的情况下,您的脚本将崩溃。在更糟糕的情况下,访问者将能够读取机密数据或更改您的数据库。以下是mysql_query()手册页中的示例:

// This could be supplied by a user, for example
$firstname = 'fred';
$lastname  = 'fox';

// Formulate Query
// This is the best way to perform an SQL query
// For more examples, see mysql_real_escape_string()
$query = sprintf("SELECT firstname, lastname, address, age FROM friends 
    WHERE firstname='%s' AND lastname='%s'",
    mysql_real_escape_string($firstname),
    mysql_real_escape_string($lastname));

// Perform Query
$result = mysql_query($query);

答案 2 :(得分:1)

这应该有效:

mysql_query("INSERT INTO reports (thedate,changes) VALUES ('$_POST[thedate]','$_POST[changes]') ON DUPLICATE KEY UPDATE changes=VALUES(changes)");

使用REPLACE的缺点是它不是标准SQL而是MySQL扩展。除此之外,当使用自动递增列时,REPLACE将重新插入不同的值。我不会向任何人推荐它。

编辑:ON DUPLICATE KEY也不是标准SQL。遗憾!