我想始终替换相同的现有数据库条目。
以下代码总是创建一个新条目,我如何修改它始终覆盖“版本”?
$sql = "REPLACE INTO `traumprojekt`
(`version`, `geschlecht`, `alter`, `fuehrerschein`)
VALUES(
'" .mysql_real_escape_string( $version ). "',
'" .mysql_real_escape_string( $geschlecht ). "',
" .$alter. ",
" .$fuehrerschein. "
)";
mysql_query( $sql );
答案 0 :(得分:3)
REPLACE只是一个插入,将"删除"添加新内容之前的旧行。
它只能确定一个" old"如果有约束将新行标记为"现有"。
你的替换声明没问题,但你应该在geschlecht
,alter
,fuehrerschein
添加一个独特的索引,这样它就可以改变版本。< / 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