2016-12-19 2 views
0

나는 다음과 같은 테이블이 있습니다MySQL 오류 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 제약의 다음과 같은 오류를 얻고있다

좋습니다. 이것은 예상대로 작동합니다.

그러나 제약 조건을 위반하지 않을 모든 행을 업데이트하고 싶습니다. 한 문장으로 가능합니까? 나는 하위 쿼리에서 같은 테이블을 사용할 수 없기 때문에 일부 mysql 플래그를 제거하거나 임시 테이블을 사용하지 않고이를 수행하는 방법을 이해할 수 없다.

UPDATE :

예 갖는 다음과 같은 데이터

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

나는 문제없이 모든 행을 업데이 트하려는, 그래서 id 4581과 하나가 같은

+4

어, 할 수 없습니다. 그래서 원하지 않는 패턴을 방지하기 위해 테이블에 고유 한 제한 조건이있는 것입니다. –

+0

예, 이해합니다. 지금 내가 원하는 것은 그 관계를 아직 가지고 있지 않은 사용자로 그 행을 갱신하는 것이므로 지금 질문을 편집 중입니다. 복제의 경우 나는 그 중 하나를 제거합니다. – 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 및 동일한 사용자 –

+0

@ JeanDoux가있는 2 줄을 작성하려고 시도합니다. 이 추가 시나리오를 반영하기 위해 조인 조건을 수정했습니다. 지금은 post_id에 대해 1000 또는 1001로 잠재적 인 2 개의 레코드 중 하나만 업데이트해야한다고 생각합니다 – Sebas

+0

이제 좋습니다. 잘 했어 ! –