2011-08-15 4 views
0

私はubuntu 12.10とMySQL WorkbenchでMySQL 5.1.41を使用しています。MySQLアップデートの参加が期待通りに機能しない

私は2つの製品表t1とt2を持っています。 t1はライブデータであり、t2はインポートされたデータであり、t1に更新して新しい製品価格をすべて更新する準備ができている。だから私は実行する:

SELECT * FROM t1 
JOIN t2 ON t1.id = t2.id 
WHERE t1.price != t2.price; 

これは、価格が異なって更新する必要がある1201レコードを返します。だから私は実行します。

UPDATE t1 JOIN t2 ON t1.id = t2.id 
SET t1.price = t2.price 
WHERE t1.price != t2.price; 

これはエラーなしで完了し、報告書1143行(複数可)の影響を受け、マッチした行:1143が変更:1143の警告:0

をので、ここですでに何かが右ではありません。選択クエリでは1201レコードが異なりますが、同じ結合および基準を使用して1143レコードのみが変更されましたか?

最初の選択クエリを実行すると、まだ価格が異なる58個のレコードが表示されます。しかし、それを実行するとき、私は最初と同じ1201を取得します。更新がコミットされていないかのようです。

アイデア?

+0

両方のテーブルentrieが同じのIdsを持って – sll

+0

't1.price'と同じタイプの' t2.price'列 – nobody

+0

何sllev手段(と思う)の両方があり、次のとおりです。です両方のテーブルの 'id'主キー?そうでない場合は、その理由 –

答えて

5

SELECTが示す数字(1201)は、t1のレコードではなく、2つのテーブルのJOINのレコードです。 2つのidUNIQUEまたはPRIMARY KEYの両方でない場合は、これが予想されます。 t1の一部の行は、t2の複数の行と一致します。 UPDATEが行われたときしかし、彼らは唯一の(これはMySQLの「機能」またはUPDATE文の間にWHERE条件を順番にチェックしUPDATEの「バグ」である。

)行数(t1のを見て、これを試してみてください一度更新されます更新する必要があります?

SELECT * FROM t1 
WHERE EXISTS 
     (SELECT * 
     FROM t2 
     WHERE t1.id = t2.id 
      AND t1.price != t2.price 
    ); 
+0

しかし、 'JOIN t2 ON t1.id = t2.id' –

+0

@Tomalak:私は' id'sと呼ばれているにもかかわらず、そのうちの一つがユニークではないと思います。他の可能な説明はありますか? –

+0

私は今、両方がPKであることを見ています。だから私はもっと混乱しています。さらに、「行が一致:1143変更:1143」というOPの詳細は表示されますが、コミットされていない更新はさらに混乱しているようです。 –