12

テーブルがあるとします:

`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

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

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

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

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

4

5 に答える 5

25

uuid()行ごとに異なる 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

衝突があれば再試行すると思います。

私の悪い。

于 2011-06-10T12:01:21.057 に答える
3

MySql に別の uuid foreach 行を作成するように指示するにはどうすればよいですか?

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

于 2011-06-10T09:11:52.823 に答える
3

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

于 2017-01-05T05:07:42.647 に答える
2

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

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

于 2018-07-31T23:24:27.857 に答える
-3

まず 、php uniqid() 関数を使用して一意の文字列を生成 し、ID フィールドに挿入します。

于 2013-03-11T10:54:35.060 に答える