2

通常,当您更新/插入时,您会使用该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。
那么,如果我只想坚持一张桌子,我应该使用什么方法?

4

3 回答 3

1

正确的选择是在您的表上创建一个唯一的复合索引(名称、语言)并使用ON DUPLICATE KEY UPDATE. 这正是ON DUPLICATE KEY UPDATEMySQL 中存在 even 的原因。

于 2013-08-22T13:18:15.180 回答
0

neutral_text您可以在和language字段上使用键集。特别是无论如何您都应该创建该密钥并且它应该是唯一的。

于 2013-08-22T12:35:38.840 回答
0

当您无论如何运行 2 个查询时,您可以更改第一个:

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

并且,在那之后,如果这个查询返回 0,你可以使用你的插入:

$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();
于 2013-08-22T12:36:47.170 回答