2012-07-19 3 views
-1

mysql 데이터베이스에 QUES 테이블이 있습니다.MySQL 테이블의 컬럼을 어떻게 고유하게합니까?

테이블의 열이 BODY이며 현재 고유하지 않습니다.

테이블에 여러 행이 있습니다. 현재 BODY은 본질적으로 고유하지만 속성으로 정의되지 않았 음을 확신합니다.

BODY을 속성으로 고유하게 정의하여 업데이트하는 방법은 무엇입니까?

누군가가 올바른 SQL 쿼리를 제안 할 수 있습니까?

감사

답변

0
ALTER TABLE QUES ADD UNIQUE (BODY). 

는 미세 수동 here를 참조하십시오.

+0

LOL @ "미세 설명서를 읽어"=) – Crontab

+0

열 "몸"으로 작동하지 LONGVARCHAR입니다 .. 다른 해결책이 있습니다. ? – codeofnode

0

다음은 시작에 도움이되는 몇 가지 SQL 문입니다. 여기서는 body이 문자 유형 열이고 가능한 기존 값을 "보존"하고 고유 한 문자열을 추가하여 "보다 고유하게"만들 것이라고 가정합니다. 조회

-- find values of `body` that are "duplicated" in the table 
SELECT q.body 
    , COUNT(1) as cnt_ 
    FROM ques q 
GROUP BY q.body 
HAVING COUNT(1) > 1 

은 우리에게 "중복"입니다 body의 특정 값 및 그 값을 공유하는 행의 수를 가져옵니다. 우리는이 고유 한 값을 가진 행을 식별 할 수 있어야합니다, 그래서 우리는 다음과 같은 쿼리를 실행할 수 있습니다

-- find all rows that have one of the "duplicated" values 
SELECT s.id 
    , s.body 
    FROM (SELECT q.body 
      FROM ques q 
     WHERE q.body IS NOT NULL 
     GROUP BY q.body 
     HAVING COUNT(1) > 1 
     ) r 
    JOIN ques s ON s.body = r.body 

사람들은 우리가 업데이트해야 할 행이 있습니다. 이 값을 고유하게 만들기 위해 각 행에 대해 body 열에 새로운 고유 값을 할당 할 수 있습니다. '새'값 중 어느 것도 이미 테이블에있는 값과 중복되지 않으면 고유 한 값을 갖게됩니다.

예 업데이트 문 : 기존의 몸 값의 끝에

다음
-- append unique value to end of each body value 
UPDATE (SELECT q.body 
      FROM ques q 
     WHERE q.body IS NOT NULL 
     GROUP BY q.body 
     HAVING COUNT(1) > 1 
     ) r 
    JOIN ques s ON s.body = r.body 
    SET s.body = CONCAT(s.body,'<!--',s.id,'-->'); 

우리가 "추가"하는 값. NOT NULL이면서 고유 한 것으로 보장 된 테이블의 기존 열을 사용할 수 있습니다. AUTO_INCREMENT 기본 키 열은 적절한 후보입니다. (고유 한 정수를 대신 생성 할 수 있습니다.)

참고 : body에 할당하는 새 값이 이미 데이터베이스에있는 값과 다를 수 있습니다. 우리는 단지 기존 복제본을 식별 한 다음 변경 사항을 적용하여 값이 서로 고유하도록 만듭니다. 우리는 정말로 다시 원을 그리며 중복 값을 다시 확인해야합니다.

body 열의 최대 길이에 대한 확인은 없습니다. 즉, 기존 값의 끝에 "room"이 있는지 여부에 따라 지정된 형식의 문자열을 추가 할 수 있습니다. 따라서 기존의 body 값 (LENGTH() 또는 CHAR_LENGTH() 함수 사용)의 크기를 확인하고이를 열 정의와 비교하여 개선 할 여지가 있습니다.

중복 값이있는 행이 2 개있는 경우 실제로 행 중 하나만 업데이트하면됩니다. 기존 값으로 둘 중 하나만 남겨 둘 수 있습니다. 예제 쿼리는 지금 당장이 작업을 수행하지 않습니다.

하지만 시작하면 충분합니다.

물론 고유 한 값을 얻은 후에는이 열에 UNIQUE 제약 조건을 추가하여 나중에 중복이 생성되지 않도록해야합니다.


이는 한 행의 body 값을 변경하지 않고 그대로 둘 수있는 방법을 보여줍니다. (A 해당 UPDATE 문은 몸의 열을 그 IF() 표현을 할당합니다.)

-- show new values for body, leave the value for one row unchanged 
SELECT s.id 
    , s.body AS old_val 
    , IF(s.id = q.min_id, s.body, CONCAT(s.body,'<!--',s.id,'-->')) AS new_val 
    FROM (SELECT q.body 
      , MIN(q.id) AS min_id 
      FROM ques q 
     WHERE q.body IS NOT NULL 
     GROUP BY q.body 
     HAVING COUNT(1) > 1 
     ) r 
    JOIN ques s ON s.body = r.body 
관련 문제