2010-06-08 4 views
0

col_Acol_B의 두 열로 구성된 간단한 table이 있습니다.MySQL : 행을 업데이트하고 복제본이 될 경우 원본을 삭제합니다.

기본 키는 둘 모두에 대해 정의됩니다.

UPDATE `table` SET `col_A` = 66 WHERE `col_A` = 70 

이 문 때로는 중복 키 오류를 얻을 :

나는 일부 행을 업데이트하고, 예를 들어, 중복을 생성 할 수 col_A 값을 할당해야합니다.

오류를 생성하는 행은 변경되지 않으므로 UPDATE IGNORE의 오류를 간단하게 무시하고 싶지 않습니다. 불행하게도 SQL에서 정당하지 않은

UPDATE `table` SET `col_A` = 66 WHERE `col_A` = 70 ON DUPLICATE KEY REPLACE 

대신, 나는 그들을 그들이

를 업데이트 한 후 내가 좋아하는 뭔가를 쓰고 싶습니다 그들이 다른 행과 충돌 할 때 삭제하려면 그래서 다른 방법을 찾는 데 도움이 필요합니다. 또한 PHP를 사용하고 있으며 하이브리드 솔루션 (즉, 부분 쿼리 부분 PHP 코드)을 고려할 수 있지만이 업데이트 작업을 수 백만 번 수행해야한다는 것을 명심하십시오. 귀하의 관심

덕분에,

실비오

알림 : 업데이트되는 동일한 테이블 조인과 UPDATE의 구문에 문제가

편집 : 미안, 열 이름 WHERE 절이 잘못되었습니다. 이제는 수정했습니다.

답변

3

대답을 개정 질문 :

DELETE FROM 
    table_A 
USING 
    table AS table_A 
    JOIN table AS table_B ON 
     table_A.col_B = table_B.col_B AND 
     table_B.col_A = 70 
WHERE 
    table_A.col_A = 66 

문제가 발생할 것입니다 행를 제거한다. 그런 다음 UPDATE 쿼리를 발행합니다. 두 개의 쿼리 사이에 번거로운 행이 다시 삽입되는 상황을 피하기 위해 트랜잭션 내부에서 모든 작업을 수행하는 것이 가장 이상적입니다.

+0

작동합니다. 감사합니다! –

1

이 테이블을 참조하는 외래 키가 있습니까? 하지 다음 경우 다음을 수행해야합니다

CREATE PROCEDURE `MyProcedure` (IN invarA INT, IN invarB INT) 
LANGUAGE SQL 
NOT DETERMINISTIC 
MODIFIES SQL DATA 
SQL SECURITY DEFINER 
BEGIN 
    DELETE FROM table WHERE col_B = invarB; 
    IF ROW_COUNT() > 0 THEN 
     INSERT INTO table (`col_A`, `col_B`) VALUES (invarA, invarB); 
    END IF; 
END 

예 전화 :

CALL `MyProcedure`(66, 70) 
+0

이 답변은 질문을 수정하기 전에 게시되었습니다. 수정 된 질문에 대한 적절한 답이 아닙니다. – Hammerite

관련 문제