大量のデータを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 トリガーを使用しないが、主キーまたは一意のインデックスを必要とする別のソリューション:
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サーバーのバージョンを使用しています:5.5.40-0 + wheezy1(Debian)
SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
クエリはそれほどきれいではありませんが、それは仕事をします。
select @i:=uuid();
update some_table set guid = (@i:=uuid());
生成された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, '-', '');
簡単な解決策ですが、これで誰かが私が失った時間を節約できることを願っています。
単純なタイプミスのように見えます。「... columnId is 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()));