2016-12-19 15 views
0

I次の表があります。Mysql ERROR 1062(23000):重複エントリ。ユニーク制約に違反しません更新行

CREATE TABLE `user_favourite_posts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `post_id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `created_at` datetime NOT NULL 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `user_post_unique` (`user_id`,`post_id`)) 

私は= 1005、以下のようなものをpost_idのために(1000年、1001年)にpost_idの持つすべての行を更新しようとしています:重複するキー 'user_post_unique' のエントリ1005:

ERROR 1062(23000):

update user_posts set post_id=1005 where post_id in(1000, 1001); 

しかし、私は理由user_post_unique制約の次のエラーを取得しています

良い。これは期待どおりに動作しています。

しかし、制約に違反しないすべての行を更新したいと思います。 1つの文で可能ですか?サブクエリで同じテーブルを使用できないため、いくつかのmysqlフラグを削除したり、一時テーブルを使用したりすることなく、どのように処理するかを理解できません。

UPDATE:

たとえば、次のようなデータに

+-------+---------+---------+ 
| id | user_id | post_id | 
+-------+---------+---------+ 
| 4581 |  2 | 1001 | 
| 9739 |  2 | 1005 | 
| 7324 |  3 | 1001 | 
+-------+---------+---------+ 

を持つ私は問題なくすべての行を更新したいと思いますので、id 4581との一つは、私はこのことを考えると同じ

+4

これはできません。そのため、テーブルにユニークな制約があり、発生したくないパターンを防ぐことができます。 –

+0

はい、わかりました。私は今質問を編集しています。なぜなら、私が本当に望むのは、関係をまだ持っていないユーザーでこれらの行を更新することだからです。複製の場合、私はそれらのうちの1つを削除するだけです。 – y2josei

+1

それは間違っています。ゴードンの権利:制約は、ここで仕事をしていて、あなたが気まぐれに物事を壊すのを防ぎます。より慎重に要件を考える必要があります。 –

答えて

2

残ります

update user_posts a 
    left join user_posts b ON b.post_id IN (1000,1001,1005) AND b.user_id = a.user_id AND b.post_id > a.post_id 
set a.post_id = 1005 
where 
    a.post_id in (1000, 1001) 
AND b.id IS NULL 
; 
+0

これは唯一可能な固有の違反ではありません。ユーザーがpost_id = 1000、post_id = 1001の場合、post_id = 1005の2行と同じユーザー –

+0

@ JeanDouxが正しいとします。この追加シナリオを反映するために結合条件を変更しました。今はpost_idのために1000または1001の潜在的な2つのレコードのうちの1つだけを更新すべきだと思う。 – Sebas

+0

今は良いことだ。よくやった ! –

関連する問題