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


100

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

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

나는 시도했다

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

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


2
? 당신이 정말로 있는지, 그들은 같은 내가 시도되어 있으며, 대부분의 문자는 동일하지만, 생성 된 UUID에서 몇 가지 차이점이 있습니다
xiaoyifang

예, 확인합니다. 동일합니다!
Cyril N.

그것은 나를 위해 작동합니다-차이점은 사소하지만 거기에 있습니다. 확인하는 가장 빠른 방법은 열에 UNIQUE 제약 조건을 추가하는 것입니다.
PSU

답변:


88

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

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모든 멋진 코드가 필요하지 않습니다.


예, 5.0에서도 작동합니다. 그러나 방아쇠를 놓는 것을 잊지 마십시오!
a1ex07 2011-08-08

그래 확실합니다 :) 나중에 중복을 확인 해야하는지 아니면 열의 모든 행에 대해 고유 한 값을 만들지 궁금하십니까?
Tom

UUID제대로 구현 된 경우 (그렇다고 생각합니다) 중복 여부를 확인하지 않고 고유 인덱스를 만들 수 있어야합니다.
a1ex07 2011-08-08

나는 또한 유용 할 수있는 다른 접근 방식으로 내 대답을 업데이트했습니다.
a1ex07 2011-08-08

2
원래 코드가 작동하면 columnId = UUID ()를 columnId = (SELECT UUID ())로 변경하십시오. 나를 위해 훌륭하게 일했습니다. 생성 된 모든 값은 거의 동일하지만 각각 고유합니다.
EJay

111

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

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

너무 간단합니다 :-)


35
처음에는 시작과 끝이 같기 때문에 중복 UUID가 삽입되었다고 생각했지만 실제로는 약간 다릅니다.
Sam Barnum 2013 년

3
@SamBarnum UUID머신 및 타임 스탬프를 기반으로 생성 되기 때문 입니다 . 실행하는 데 밀리 초가 걸리는 쿼리는 실제로 매우 유사해야하지만 동일하지 않아야합니다. 확실한 것은 UNIQUE해당 열에 인덱스를 추가하는 것입니다.
balexandre 2014

2
받아 들여지는 대답은 이것에 비해 과잉으로 보입니다!
Xtreme Biker

4
적어도 mariadb (10.1.26)에서는 작동하지 않는 것 같으며 모든 레코드에 대해 동일한 uuid를 제공합니다.
johanvdw

4
이것은 아마도 하위 쿼리에 있고 MySQL이 먼저 내부 쿼리를 실행하고 모든 행에 대해 동일한 값을 사용하기 때문에 모든 레코드에서 동일한 UUID를 생성했습니다. 이를 해결하려면 하위 쿼리를 제거하십시오.UPDATE sri_issued_quiz SET quiz_id=uuid();
Chris White

22

승인 된 솔루션은 고유 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)을 사용하고 있습니다.


5
제 경우에는 생성 된 GUID에 하이픈이 필요했습니다. 나는 이것을 사용했다 : SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')쿼리는 그다지 예쁘지는 않지만 작업을 수행합니다.
solo

9
md5는 UUID보다 덜 고유하지 않습니까? 충돌이 걱정됩니다.
Adam

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

1
완벽 완벽 완벽 !! 이렇게 작은 것이 큰 영향을 미칠 수 있습니다 !!
thekosmix

5

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, '-', '');

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


4

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

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

1
나는 질문을 읽을 때 같은 생각을 가졌지 만 그렇게 생각하지 않습니다. 그의 열에는 값이 있지만 UNIQUE 값이 아닌 것처럼 들립니다. 답변하기 훨씬 전에 주어진 답변은 이미 필요한 것을 보여줍니다. WHERE절이 없어야합니다 . 그리고 생성 된 값은 매우 유사하므로 실제로 다른지 확인하려면 자세히 살펴 봐야합니다.
ToolmakerSteve

3

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

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

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

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

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


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

2
코드 작동 방식에 대한 설명을 추가하십시오. 주석이없는 코드는 다른 SO 사용자가 항상 이해하기 쉬운 것은 아닙니다.
Simas Joneliunas

기존 데이터에서 uuid를 업데이트하려면 위와 같이 조건으로 쿼리를 실행하십시오.
Ashutosh Niranjan

0

MYsql UPDATE 테이블 이름 SET columnName = UUID ()

오라클 업데이트 테이블 이름 SET columnName = SYS_GUID ();

SQLSERVER UPDATE 테이블 이름 SET columnName = NEWID () ;;


0
// UID Format: 30B9BE365FF011EA8F4C125FC56F0F50
UPDATE `events` SET `evt_uid` = (SELECT UPPER(REPLACE(@i:=UUID(),'-','')));

// UID Format: c915ec5a-5ff0-11ea-8f4c-125fc56f0f50
UPDATE `events` SET `evt_uid` = (SELECT UUID());

// UID Format: C915EC5a-5FF0-11EA-8F4C-125FC56F0F50
UPDATE `events` SET `evt_uid` = (SELECT UPPER(@i:=UUID()));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.