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 が実行されます。
では、1 つのテーブルだけに固執したい場合は、どのようなアプローチを使用すればよいでしょうか?

4

3 に答える 3

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 に答える
0

キー セット オンneutral_textおよびlanguageフィールドを使用できます。特に、とにかくそのキーを作成する必要があり、それは一意である必要があります。

于 2013-08-22T12:35:38.840 に答える