web-dev-qa-db-ja.com

既存のデータ用にMySQLでGUIDを生成しますか?

MySQLテーブルに大量のデータをインポートしたばかりで、基本的に既存のすべての行を新しい一意のランダムGUIDで埋める列「GUID」があります。

MySQLでこれを行うにはどうすればよいですか?

私は試した

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

そして、すべてのフィールドを同じにする

82
Tom

それが最も簡単な方法かどうかはわかりませんが、動作します。アイデアは、すべての作業を実行するトリガーを作成してから、テーブルを更新するクエリを実行し、最後にこのトリガーを削除することです。

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

UPDATEもう一度:元のクエリも機能するようです(おそらくWHERE columnID is not nullは必要ないので、すべてのファンシーなコードは必要ありません。

76
a1ex07

既存のテーブルにguid主キー列を追加し、一意のGUIDを設定する必要がありましたが、この更新クエリは内部選択で機能しました。

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

とても簡単 :-)

93

承認されたソリューションは一意の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)を使用しています

19
Imran-UK
select @i:=uuid();
update some_table set guid = (@i:=uuid());
9
Brad Johnson

生成されたUUIDを変更しようとしたときに奇妙な結果になったため、ちょっとした追加を行いました。 answer by Rakesh は、ダッシュを削除する場合を除いて、最も簡単に機能することがわかりました。

参考のため:

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

シンプルな解決策はもちろんですが、これにより誰かが私が失った時間を節約できることを願っています。

5
enobrev

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

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

私はほとんど同じ問題に直面しました。私の場合、uuidはBINARY(16)として保存され、NOT NULL UNIQUE制約があります。そして、私はすべての行に同じUUIDが生成されたときに問題に直面しましたが、UNIQUE制約ではこれが許可されていません。したがって、このクエリは機能しません。

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

しかし、私にとっては、ネストされた内部選択でこのようなクエリを使用するとうまくいきました:

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

次に、すべてのエントリに対して一意の結果が生成されます。