新しい行を挿入しようとしていますが、キーがすでに存在する場合は、テーブル内の他の特定の値が異なる場合にのみ行を更新します。これはmysqlのクエリ/文で可能ですか?条件付き重複キーの更新
私のテーブルには、以下の列で構成さ:帽子、ミトン、名前、LAST_UPDATE
帽子+ミトンは、一意のインデックス(「帽子」と「ミトン」の値は、色と言う)
を作りますこれがすでにテーブルに入っているとしましょう:
1. hat=blue mittens=green name=george last_update=tuesday 2. hat=red mittens=green name=bill last_update=monday
新しい鍵では、いつものように挿入したいと思います。重複キーでは、名前が変更された場合にのみ更新を行います。それ以外の場合は無視します。この理由は、last_updateの値(タイムスタンプ)を保持したいからです。
hat=yellow mittens=purple name=jimmy -- insert new row hat=blue mittens=green name=george -- ignore hat=blue mittens=green name=betty -- update row
は、これが最初に、値を比較し、必要に応じて、更新を発行し、既存の行をルックアップするために別々のステートメントを使用しなくても可能ですか?もしそうなら、構文は何でしょうか?
ご回答ありがとうございます。私はそれらのすべてを試しました。実際、単純なUPDATE文を使用すると、更新される行がなくなります。
update tbl set name='george' where hat='blue' and mittens='green'
しかし、いずれか
INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name='george';
又は
INSERT INTO tbl (hat, mittens, name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name=CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END;
を使用して何とか更新(およびタイムスタンプが変更)された行になります。
FWIW、これは私が使用しているテーブルです:
CREATE TABLE `tbl` (
`hat` varchar(11) default NULL,
`mittens` varchar(11) default NULL,
`name` varchar(11) default NULL,
`stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
UNIQUE KEY `clothes` (`hat`,`mittens`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
MySQLは、再度回答のすべてのための私の感謝のバージョン4.1.22(?おそらくこれが重要) です。
私はそれがここでの問題は、あなたのMySQLのバージョンであることを推測します。 4.1ブランチのアクティブなサポートが終了した後、5.0ブランチでINSERT ... ON DUPLICATE KEY UPDATEを使用してバグ(http://bugs.mysql.com/bug.php?id=28904)を修正したようです31,2006)。私はあなたのテーブルとテストケースを私のマシンに再作成しました。それは期待どおりに動作し、MySQL Server 5.0.67を実行しています。 MySQLインストールを更新できない場合は、問題に対する「単一クエリ」の解決策がなければ、問題が発生する可能性があります。 – zombat
が確認されました。どちらのソリューションも5.0.45で動作します(残念なことに、それは単なるdevサーバです)。再度、感謝します! – javalina
提案した2つのクエリのうち2番目のクエリを試しましたか?スタンプ(last_update)列に何が起こったかを手動で制御したものはありますか?別のcase文で列を更新するかどうかを明示的に決定するので、バグが存在しても動作するはずです。 – Dipin