当唯一ID不可用时,在INSERT / UPDATE之间决定的最佳方法

时间:2013-08-22 12:30:29

标签: php mysql insert-update

通常,在更新/插入时,请使用on duplicate key update语句。但我正在插入/更新这样的表:

id | neutral text | language | translation
---+--------------+----------+------------
 0 |       SUBMIT |       en |      Submit
 1 |       SUBMIT |       cs |     Odeslat
 2 |       SUBMIT |       fr |    Démarrer

我知道我应该制作3张桌子,但项目不是很大,所以我决定让它变得相当简单。

现在,当我想要更改或添加翻译时,请执行以下操作:

/*
 $this->lang_class->table = the name of my table
 $offset = neutral text name
 $this->lang = language name
 $value = new translation
*/
$this->debug("Translate attempt!<br />");
//Try to update, insert will be performed if update returns 0 rows
$update = $this->pdo->prepare("UPDATE `{$this->lang_class->table}` SET content='$value' WHERE lang='{$this->lang}' AND name='$offset'");
$update->execute();  //try to update
if($update->rowCount()==0) {  //If no update happened, insert
  $this->debug("Creating new translation entry.<br />");
  $this->execsql("INSERT INTO `{$this->lang_class->table}` (lang, name, content) VALUES ('{$this->lang}', '$offset', '$value')");
}
return $value;

问题是,有时可能会发生,新的翻译与旧的翻译相匹配。在这种情况下,UPDATE将返回0行并执行INSERT 那么我应该使用什么方法,如果我只想坚持一个表?

3 个答案:

答案 0 :(得分:1)

正确的选项是在表上创建唯一的复合索引(name,lang),并使用ON DUPLICATE KEY UPDATE将新值竖立起来。这就是为什么ON DUPLICATE KEY UPDATE甚至存在于MySQL中的原因。

答案 1 :(得分:0)

您可以在neutral_textlanguage字段上使用密钥集。特别是你应该创建那个密钥,它应该是唯一的。

答案 2 :(得分:0)

当你运行2个查询时,你可以改变第一个:

SELECT count(*) FROM translate_table WHERE lang='$lang' AND name='$name';

然后,如果此查询返回0,则可以使用insert:

$this->execsql("INSERT INTO `{$this->lang_class->table}` (lang, name, content) VALUES ('{$this->lang}', '$offset', '$value')");

否则运行您的更新查询:

$this->pdo->prepare("UPDATE `{$this->lang_class->table}` SET content='$value' WHERE lang='{$this->lang}' AND name='$offset'")->execute();