2009-06-17 20 views
2

シナリオから複数のフィールドを更新する:MYSQLは、別のテーブルのフィールド

私はアプリケーションを使用する各Webサイトのthatsのための設定データを保存する設定テーブルを持つアプリケーションを持っています。私はconfigテーブルにいくつかの余分な列を追加し、これをすべてのアプリケーションにロールアウトしました。私は以来、これらの新しい列をすべての設定テーブルで同じにする必要のあるデータで更新しました。

どうすればいいですか?

私が最初に考えたのは、次の表を複製して行うには、次のようになります。

UPDATE `config` SET `config`.`new1` = `tmp_config`.`new1`, `config`.`new2` = `tmp_config`.`new2` LEFT JOIN `tmp_config` ON (`tmp_config`.`tmp_id` = `config`.`id`)

が、これは必要な影響を与えているだろう。

答えて

7

以下は内部結合を使用して、クエリの最後にSETを移動(私のために働いています!すべてのあなたの助けを

UPDATE `config` INNER JOIN `tmp_config` ON (`tmp_config`.`id` = `config`.`id`) 
SET `config`.`new1` = `tmp_config`.`new1`, `config`.`new2` = `tmp_config`.`new2`

おかげで

1

あなたは次のように実行する必要があります。

編集

CREATE TABLE oldtable FROM newtable SELECT *;

MySQL creates new columns for all elements in the SELECT. For example: 
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, 
    ->  PRIMARY KEY (a), KEY(b)) 
    ->  TYPE=MyISAM SELECT b,c FROM test2; 
+0

-1、動作しません –

+0

既存のテーブルに問題があるデータを取得するために保持テーブルを細かく作成しました – Lizard

+0

+1回答を修正しました –

2

これは(tmp_configで一致がない場合、ヌル)二つのテーブルからこれまでのIDが一致しtmp_configでNEW1とNEW2の値に設定してNEW1とNEW2を更新する効果を持っている必要があります。

私はそれがあなたがやろうとしていることだと思います。 MySql update referenceから

ます。また、複数のテーブルをカバーするUPDATE操作 を行うことができます。ただし、 は、 複数テーブルの更新でORDER BYまたはLIMITを使用することはできません。 table_references句には、結合に含まれる テーブルがリストされます。その 構文については、 12.2.8.1、 "JOIN構文"を参照してください。ここに例があります:

UPDATE項目、月SET items.price = month.price WHERE items.id = month.id;

この場合、「JOIN」構文は使用されていませんが、JOIN構文は有効である必要があります。これはSET句の前に行う必要があります。

それはあなたがそれを置く更新構文が許可されていません

UPDATE `config` 
    LEFT JOIN `tmp_config` ON (`tmp_config`.`tmp_id` = `config`.`id`) 
    SET `config`.`new1` = `tmp_config`.`new1`, `config`.`new2` = `tmp_config`.`new2` 
+0

ありがとうございました。私はあなたの投稿を読む直前にこのソリューションに来ました。私の状況。 – Lizard

1

マルチテーブル結合のようになり、http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE 
    config, tmp_config 
SET 
    config.new1 = tmp_config.new1, 
    config.new2 = tmp_config.new2 
WHERE 
    tmp_config.tmp_id = config.id
トリック(未テスト、いかなる保証も;-))行う必要があります見ます

3

私はすべてのあなたの質問をよく理解していません。どこで設定を変更しましたか?あなたが他の場所で

マルチテーブルの更新のための正しい構文についてはVolkerK'sの回答を参照してくださいアプリケーションの設定を更新しているすべてのアプリケーション

  • のスキーマを変更した

    1. :私はあなたの説明をお読みください。

      使用しているストレージエンジンはどれですか? InnoDb(またはトランザクションをサポートする他のエンジン)の場合は、クエリを実行する前にトランザクションを開始する必要があります。そして、あなたはすべての変更をコミットする前に結果が必要なものであることを確認することができます

      例:

      のmysql> START TRANSACTIONを。

      mysql> SELECT * FROM Configs LIMIT 5; - ConfigsにはLIMIT 5 SELECT * FROM>それは

      MySQLの>ここにファイル名を指定して実行の更新クエリ

      mysqlの前にどのように見えるかを参照してください。 - 結果が期待されたものであることを確認してください。

      mysql> COMMIT;

  • +0

    +1 f結果を知らないものを試してみると、コミットやロールバックに関する良いアドバイスが必要です。 – tschaible

    +0

    基本的には、他のすべてのアプリケーションに必要なデータで本番アプリケーションを更新しました。これは、古いフィールドの既存のデータを変更することなく、新しいフィールドと新しいデータで既存のテーブルを更新することを意味します。 (申し訳ありませんが説明するのは難しいです) - これを複雑にするのは良いチャンスです。 私はMyISAMを使用しています。私は更新クエリを探していましたが、 – Lizard

    関連する問題