あなたがテーブルを持っているとしましょう:
`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コマンドを発行できることはわかっていますが、それはしたくありません。作業を実行したいのですが。それが行われることになっているデータベースサーバー上。
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
衝突があった場合は再試行すると思います。
私の悪い。
Uuid()の代わりにMID(UUID(),1,36)
を試してください。
MySqlに各行に異なるuuidを作成するように命令するにはどうすればよいですか?
MySQLは、デフォルト値として式を許可しません。フィールドをnullにすることで、これを回避できます。次に 挿入/更新トリガーを追加 これはnullの場合、フィールドをuuid()に設定します。
MySQLのUUID()関数は、V1 UUIDを生成します。これは、時間、シーケンス、およびノードフィールドに分割されます。単一のノードで呼び出す場合、時間フィールドの数ビットのみが異なります。これは、時間的一意性と呼ばれます。まったく同時に異なるノードで呼び出すと、ノードフィールドが異なります。これは、空間的一意性と呼ばれます。この2つを組み合わせると非常に強力であり、普遍的な一意性が保証されますが、各V1 UUIDがいつどこで作成されたかに関する情報も漏洩するため、セキュリティの問題になる可能性があります。おっと。
V4 UUIDは、そのデータ(およびそれ以上)を一緒にハッシュして何もリークしないため、現在一般的に人気がありますが、それらを取得するには別の関数が必要です。 INSERTボリュームが大きい。 MySQL(少なくとも今のところ)は(疑似)ランダム値のインデックス作成があまり得意ではないため、V1が提供されます。