[mysql] MySQL에서 기존 데이터에 대한 GUID를 생성 하시겠습니까?

방금 MySQL 테이블에 많은 데이터를 가져 왔고 기본적으로 기존의 모든 행을 새롭고 고유 한 임의 GUID로 채우려는 “GUID”열이 있습니다.

MySQL에서 어떻게해야합니까?

나는 시도했다

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is not null

그리고 모든 필드를 동일하게



답변

가장 쉬운 방법인지는 모르겠지만 작동합니다. 아이디어는 모든 작업을 수행하는 트리거를 만든 다음 테이블을 업데이트하는 쿼리를 실행하고 마지막으로이 트리거를 삭제하는 것입니다.

delimiter //
create trigger beforeYourTableUpdate  BEFORE UPDATE on YourTable
FOR EACH ROW
BEGIN
  SET new.guid_column := (SELECT UUID());
END
//

그런 다음 실행

UPDATE YourTable set guid_column = (SELECT UUID());

그리고 DROP TRIGGER beforeYourTableUpdate;

업데이트
트리거를 사용하지 않지만 기본 키 또는 고유 인덱스가 필요한 또 다른 솔루션 :

UPDATE YourTable,
INNER JOIN (SELECT unique_col, UUID() as new_id FROM YourTable) new_data
ON (new_data.unique_col = YourTable.unique_col)
SET guid_column = new_data.new_id

다시 한 번 업데이트 : 원래 쿼리도 작동 해야하는 것 같습니다 (아마도 필요하지 않으므로 WHERE columnID is not null모든 멋진 코드가 필요하지 않습니다.


답변

기존 테이블에 guid 기본 키 열을 추가하고 고유 한 GUID로 채워야했습니다.이 업데이트 쿼리에는 내부 선택이 효과적이었습니다.

UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());

너무 간단합니다 🙂


답변

승인 된 솔루션은 고유 ID를 생성하지만 언뜻보기에는 동일 해 보이지만 처음 몇 글자 만 다릅니다.

눈에 띄게 다른 키를 원한다면 다음을 시도하십시오.

update CityPopCountry set id = (select md5(UUID()));


MySQL [imran@lenovo] {world}> select city, id from CityPopCountry limit 10;
+------------------------+----------------------------------+
| city                   | id                               |
+------------------------+----------------------------------+
| A Coruña (La Coruña)   | c9f294a986a1a14f0fe68467769feec7 |
| Aachen                 | d6172223a472bdc5f25871427ba64e46 |
| Aalborg                | 8d11bc300f203eb9cb7da7cb9204aa8f |
| Aba                    | 98aeeec8aa81a4064113764864114a99 |
| Abadan                 | 7aafe6bfe44b338f99021cbd24096302 |
| Abaetetuba             | 9dd331c21b983c3a68d00ef6e5852bb5 |
| Abakan                 | e2206290ce91574bc26d0443ef50fc05 |
| Abbotsford             | 50ca17be25d1d5c2ac6760e179b7fd15 |
| Abeokuta               | ab026fa6238e2ab7ee0d76a1351f116f |
| Aberdeen               | d85eef763393862e5fe318ca652eb16d |
+------------------------+----------------------------------+

MySQL Server 버전 : 5.5.40-0 + wheezy1 (Debian)을 사용하고 있습니다.


답변

select @i:=uuid();
update some_table set guid = (@i:=uuid());


답변

UUID가 생성 될 때 수정하려고 할 때 이상한 결과를 얻었 기 때문에 약간의 추가 작업을 수행했습니다. Rakesh 을 찾았습니다. , 잘 작동하는 간단한 일이 대시를 제거하려는 경우를 제외 할 수 있습니다.

참고로 :

UPDATE some_table SET some_field=(SELECT uuid());

이것은 그 자체로 완벽하게 작동했습니다. 그러나 이것을 시도했을 때 :

UPDATE some_table SET some_field=(REPLACE((SELECT uuid()), '-', ''));

그런 다음 모든 결과 값이 동일했습니다 (미묘하게 다르지 않음- GROUP BY some_field쿼리로 네 번 확인 ). 괄호를 어떻게 배치하든 똑같은 일이 발생합니다.

UPDATE some_table SET some_field=(REPLACE(SELECT uuid(), '-', ''));

REPLACE로 UUID를 생성하기 위해 하위 쿼리를 둘러 쌀 때 UUID 쿼리를 한 번만 실행하는 것 같습니다. 이는 아마도 나보다 훨씬 똑똑한 개발자에게 최적화로서 완벽하게 이해되지만 나에게는 그렇지 않았습니다.

이 문제를 해결하기 위해 두 개의 쿼리로 나누었습니다.

UPDATE some_table SET some_field=(SELECT uuid());
UPDATE some_table SET some_field=REPLACE(some_field, '-', '');

분명히 간단한 해결책이지만, 이것이 내가 방금 잃어버린 시간을 절약 할 수 있기를 바랍니다.


답변

단순한 오타처럼 보입니다. “… columnId null 인 경우” 를 의미하지 않았습니까 ?

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is null


답변

나는 거의 같은 문제에 직면했습니다. 내 경우 uuid는 BINARY (16)로 저장되고 NOT NULL UNIQUE 제약 조건이 있습니다. 그리고 모든 행에 대해 동일한 UUID가 생성되고 UNIQUE 제약 조건이 이것을 허용하지 않을 때 문제에 직면했습니다. 따라서이 쿼리는 작동하지 않습니다.

UNHEX(REPLACE(uuid(), '-', ''))

하지만 나에게는 중첩 된 내부 선택과 함께 이러한 쿼리를 사용할 때 작동했습니다.

UNHEX(REPLACE((SELECT uuid()), '-', ''))

그런 다음 모든 항목에 대해 고유 한 결과가 생성됩니다.