web-dev-qa-db-ja.com

MySql Insert Select uuid()

あなたがテーブルを持っているとしましょう:

`item`

フィールドあり:

`id` VARCHAR( 36 ) NOT NULL
,`order` BIGINT UNSIGNED NOT NULL

そして:

Unique(`id`)

そして、あなたは電話します:

INSERT INTO `item` (
`item`.`id`,`item`.`order`
) SELECT uuid(), `item`.`order`+1

MySqlは、新しく作成されたすべての行に同じuuidを挿入します。

したがって、次のように始めると、

aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1

最終的には次のようになります。

aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 2

MySqlに行ごとに異なるuuidを作成するように命令するにはどうすればよいですか?

私は、以下がMSSQLで期待どおりに機能することを知っています。

INSERT INTO item (
id,[order]
) SELECT newid(), [order]+1

n.b.結果を選択してループし、PHPコードから行ごとに個別のINSERTコマンドを発行できることはわかっていますが、それはしたくありません。作業を実行したいのですが。それが行われることになっているデータベースサーバー上。

8
Richard

Uuid()is行ごとに異なるuuidを生成することがわかります。

しかし、私が通常予想するように、すべてのチャンクをランダムに生成する代わりに、MySqlは2番目のチャンクのみをランダムに生成しているように見えます。おそらくより効率的です。

したがって、実際にはMySqlが2番目のチャンクを変更した場合、一見するとuuidは同じように見えます。例えば.

cccccccc-cccc-cccc-cccc-cccccccccccc
ccccdddd-cccc-cccc-cccc-cccccccccccc
cccceeee-cccc-cccc-cccc-cccccccccccc
ccccffff-cccc-cccc-cccc-cccccccccccc

衝突があった場合は再試行すると思います。

私の悪い。

18
Richard

Uuid()の代わりにMID(UUID(),1,36)を試してください。

3
Lâm Nguyễn

MySqlに各行に異なるuuidを作成するように命令するにはどうすればよいですか?

MySQLは、デフォルト値として式を許可しません。フィールドをnullにすることで、これを回避できます。次に 挿入/更新トリガーを追加 これはnullの場合、フィールドをuuid()に設定します。

3

MySQLのUUID()関数は、V1 UUIDを生成します。これは、時間、シーケンス、およびノー​​ドフィールドに分割されます。単一のノードで呼び出す場合、時間フィールドの数ビットのみが異なります。これは、時間的一意性と呼ばれます。まったく同時に異なるノードで呼び出すと、ノードフィールドが異なります。これは、空間的一意性と呼ばれます。この2つを組み合わせると非常に強力であり、普遍的な一意性が保証されますが、各V1 UUIDがいつどこで作成されたかに関する情報も漏洩するため、セキュリティの問題になる可能性があります。おっと。

V4 UUIDは、そのデータ(およびそれ以上)を一緒にハッシュして何もリークしないため、現在一般的に人気がありますが、それらを取得するには別の関数が必要です。 INSERTボリュームが大きい。 MySQL(少なくとも今のところ)は(疑似)ランダム値のインデックス作成があまり得意ではないため、V1が提供されます。

1
StephenS