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 トリガーを使用しないが、主キーまたは一意のインデックスを必要とする別のソリューション:

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

ええ確かに:)後で重複をチェックする必要があるかどうか、またはこれが列のすべての行に一意の値を作成するかどうか疑問に思っていますか?
トム・

場合はUUID(と私はそれがあると信じて)適切に実装されている、あなたは、重複がないことを確認せずに一意のインデックスを作成することができるはずです。
a1ex07

私も役立つかもしれない別のアプローチで私の答えを更新しました。
a1ex07

2
オリジナルのコードは機能します。columnId= UUID()をcolumnId =(SELECT UUID())に変更するだけです。私にとってはうまくいきました。生成されたすべての値はほぼ同じですが、それぞれが一意です。
EJay 2012

111

既存のテーブルにGUID主キー列を追加し、それに一意のGUIDを入力する必要がありました。内部の選択を使用したこの更新クエリは私のために機能しました:

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

とても簡単 :-)


35
最初は重複するUUIDが挿入されていると思っていましたが、それらはすべて同じ始まりと終わりを持っているためですが、実際には少し異なります。
Sam Barnum 2013年

3
@SamBarnum UUIDは、マシンとタイムスタンプに基づいて生成されるためです。実行に数ミリ秒かかるクエリとして、実際には非常に接近している必要がありますが、決して同じではありません...確実にするにはUNIQUE、その列にインデックスを追加する必要があります。
balexandre 2014年

2
受け入れられた答えはこれに比べてやりすぎのようです!
エクストリームバイカー2017

4
少なくともmariadb(10.1.26)では、これは機能していないようで、すべてのレコードに同じuuidを与えます。
johanvdw 2018年

4
これにより、すべてのレコードで同じUUIDが生成されました。おそらくそれがサブクエリにあり、MySQLが最初に内部クエリを実行し、すべての行に同じ値を使用するためです。それを解決するには、サブクエリを削除しますUPDATE sri_issued_quiz SET quiz_id=uuid();
クリス・ホワイト

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サーバーのバージョンを使用しています:5.5.40-0 + wheezy1(Debian)


5
私の場合、生成されたGUIDにハイフンが必要でした。私はこれを使用しました: SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')クエリはそれほどきれいではありませんが、それは仕事をします。
ソロ

9
md5はUUIDよりも一意ではありませんか?衝突が心配です。
アダム


5

生成されたUUIDを変更しようとすると、奇妙な結果に終わってしまったため、ちょっとした追加を行いました。私が見つかりました。その答えによってラケッシュはあなたがダッシュをストリップしたい場合を除いて、よく働いている最も簡単なこと。

参考のため:

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

これはそれ自体で完全に機能しました。しかし、私がこれを試したとき:

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

その後、すべての結果の値は同じでした(微妙に異なることはありません- GROUP BY some_fieldクエリで4倍にチェックしました)。かっこをどのように配置したかは関係ありません。同じことが起こります。

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

サブクエリを囲んでREPLACEを使用してUUIDを生成する場合、UUIDクエリは1回しか実行されないようです。これは、私よりもはるかに賢い開発者にとって最適化として完全に理にかなっていますが、私にはわかりませんでした。

これを解決するには、2つのクエリに分割します。

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

簡単な解決策ですが、これで誰かが私が失った時間を節約できることを願っています。


4

単純なタイプミスのように見えます。「... columnId is null」という意味ではありませんか?

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

1
質問を読んだときも同じように思いましたが、そうは思いませんでした。彼の列には値が含まれているようですが、一意の値は含まれていません。あなたの答えのずっと前に与えられた答えはすでに必要なものを示しています。WHERE条項があるべきではありません。そして、生成された値は非常に似ているため、実際に異なることを確認するためにそれらを注意深く調べる必要があります。
ToolmakerSteve 2015

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 tablename SET columnName = UUID()

oracle UPDATE tablename SET columnName = SYS_GUID();

SQLSERVER UPDATE tablename 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.