MySQL总是覆盖现有的数据库条目(UPDATE,REPLACE,INSERT ????)

时间:2014-06-30 13:32:59

标签: php mysql replace insert

我想始终替换相同的现有数据库条目。

以下代码总是创建一个新条目,我如何修改它始终覆盖“版本”?

$sql = "REPLACE INTO `traumprojekt` 
            (`version`, `geschlecht`, `alter`, `fuehrerschein`)

        VALUES(
            '" .mysql_real_escape_string( $version ). "',
            '" .mysql_real_escape_string( $geschlecht ). "',
            " .$alter. ",
            " .$fuehrerschein. "
            )";

mysql_query( $sql );

3 个答案:

答案 0 :(得分:3)

REPLACE只是一个插入,将"删除"添加新内容之前的旧行。

它只能确定一个" old"如果有约束将新行标记为"现有"。

你的替换声明没问题,但你应该在geschlechtalterfuehrerschein添加一个独特的索引,这样它就可以改变版本。< / p>

替代方案可以是INSERT ... ON DUPLICATE KEY UPDATE,但您还需要一个唯一的密钥。区别在于REPLACE执行DELETE,然后执行INSERT; INSERT ... ON DUPLICATE KEY UPDATE执行UPDATE而不是INSERT。重要的是例如触发器......

答案 1 :(得分:0)

就个人而言,我会改用UPDATE。例如:

REPLACE INTO `traumprojekt` 
  (`version`, `geschlecht`, `alter`, `fuehrerschein`)
VALUES(
  '" .mysql_real_escape_string( $version ). "',
  '" .mysql_real_escape_string( $geschlecht ). "',
  " .$alter. ",
  " .$fuehrerschein. "
)
WHERE
  /* Your condition here */;

答案 2 :(得分:0)

在某些列上创建唯一键。这样,当没有数据时脚本将插入一次,然后在列密钥重复时更新。假设您在版本列上创建了一个唯一索引:

$sql = "INSERT INTO `traumprojekt` 
        (`version`, `geschlecht`, `alter`, `fuehrerschein`)

    VALUES(
        '" .mysql_real_escape_string( $version ). "',
        '" .mysql_real_escape_string( $geschlecht ). "',
        " .$alter. ",
        " .$fuehrerschein. "
        ) ON DUPLICATE KEY UPDATE 
        `geschlecht`='" .mysql_real_escape_string( $geschlecht ). "',
        `alter`=" .$alter. ", `fuehrerschein`= " .$fuehrerschein;

或者,如果您希望表中只有一条记录,那么您可以创建一个名为Id作为TinyINT的唯一列,并在其上建立逻辑:

$sql = "INSERT INTO `traumprojekt` 
        (`id`,`version`, `geschlecht`, `alter`, `fuehrerschein`)

    VALUES(1,
        '" .mysql_real_escape_string( $version ). "',
        '" .mysql_real_escape_string( $geschlecht ). "',
        " .$alter. ",
        " .$fuehrerschein. "
        ) ON DUPLICATE KEY UPDATE 
        `version`='" .mysql_real_escape_string( $version ). "',
        `geschlecht`='" .mysql_real_escape_string( $geschlecht ). "',
        `alter`=" .$alter. ", `fuehrerschein`= " .$fuehrerschein;

MySQL文档在这里: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html