mysql 데이터베이스에 QUES
테이블이 있습니다.MySQL 테이블의 컬럼을 어떻게 고유하게합니까?
테이블의 열이 BODY
이며 현재 고유하지 않습니다.
테이블에 여러 행이 있습니다. 현재 BODY
은 본질적으로 고유하지만 속성으로 정의되지 않았 음을 확신합니다.
열 BODY
을 속성으로 고유하게 정의하여 업데이트하는 방법은 무엇입니까?
누군가가 올바른 SQL 쿼리를 제안 할 수 있습니까?
감사
mysql 데이터베이스에 QUES
테이블이 있습니다.MySQL 테이블의 컬럼을 어떻게 고유하게합니까?
테이블의 열이 BODY
이며 현재 고유하지 않습니다.
테이블에 여러 행이 있습니다. 현재 BODY
은 본질적으로 고유하지만 속성으로 정의되지 않았 음을 확신합니다.
열 BODY
을 속성으로 고유하게 정의하여 업데이트하는 방법은 무엇입니까?
누군가가 올바른 SQL 쿼리를 제안 할 수 있습니까?
감사
ALTER TABLE QUES ADD UNIQUE (BODY).
는 미세 수동 here를 참조하십시오.
다음은 시작에 도움이되는 몇 가지 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
LOL @ "미세 설명서를 읽어"=) – Crontab
열 "몸"으로 작동하지 LONGVARCHAR입니다 .. 다른 해결책이 있습니다. ? – codeofnode