방금 MySQL 테이블에 많은 데이터를 가져 왔고 기본적으로 기존의 모든 행을 새롭고 고유 한 임의 GUID로 채우려는 "GUID"열이 있습니다.
MySQL에서 어떻게해야합니까?
나는 시도했다
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
그리고 모든 필드를 동일하게
방금 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
모든 멋진 코드가 필요하지 않습니다.
UUID
제대로 구현 된 경우 (그렇다고 생각합니다) 중복 여부를 확인하지 않고 고유 인덱스를 만들 수 있어야합니다.
기존 테이블에 guid 기본 키 열을 추가하고 고유 한 GUID로 채워야했습니다.이 업데이트 쿼리에는 내부 선택이 효과적이었습니다.
UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());
너무 간단합니다 :-)
UUID
은 머신 및 타임 스탬프를 기반으로 생성 되기 때문 입니다 . 실행하는 데 밀리 초가 걸리는 쿼리는 실제로 매우 유사해야하지만 동일하지 않아야합니다. 확실한 것은 UNIQUE
해당 열에 인덱스를 추가하는 것입니다.
UPDATE sri_issued_quiz SET quiz_id=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 INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
쿼리는 그다지 예쁘지는 않지만 작업을 수행합니다.
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
WHERE
절이 없어야합니다 . 그리고 생성 된 값은 매우 유사하므로 실제로 다른지 확인하려면 자세히 살펴 봐야합니다.
나는 거의 같은 문제에 직면했습니다. 내 경우 uuid는 BINARY (16)로 저장되고 NOT NULL UNIQUE 제약 조건이 있습니다. 그리고 모든 행에 대해 동일한 UUID가 생성되고 UNIQUE 제약 조건이 이것을 허용하지 않을 때 문제에 직면했습니다. 따라서이 쿼리는 작동하지 않습니다.
UNHEX(REPLACE(uuid(), '-', ''))
하지만 나에게는 중첩 된 내부 선택과 함께 이러한 쿼리를 사용할 때 작동했습니다.
UNHEX(REPLACE((SELECT uuid()), '-', ''))
그런 다음 모든 항목에 대해 고유 한 결과가 생성됩니다.
UPDATE db.tablename SET columnID = (SELECT UUID()) where columnID is not null
// 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()));