🐥

with句の中のuuidの不思議

2023/06/06に公開

これは何?

最近、とある表を一意化するためにWith句の中でuuidを作成する関数を呼び出し時に、思っていた挙動と違う動きがBIGQUERYで起こったのでメモ

bigqueryの場合

With A as (
    select generate_uuid() as uuid
)
select * from A 
union all
select * from A

uuidは同じなので完全に同じ行が2行出ると思ったが、下記のようにuuidは異なっていた。

uuid
dcb09b73-a85b-48f6-b2cf-fdab80f2755e
4c06bc90-a3fa-48d9-aa8f-592ba569dd7d

mysqlの場合

With A as (
    select uuid() as uuid
)
select * from A 
union all
select * from A
uuid
8236b675-03a3-11ee-a482-0242ac170002
8236b675-03a3-11ee-a482-0242ac170002

思った通り。

ちなみにバージョンは8.0.23

postgresqlの場合

拡張機能の場合

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

With A as (
SELECT uuid_generate_v4() uuid
)
select * from A 
union all
select * from A
uuid
9f793df0-c9d8-42a3-8782-36b417858c65
9f793df0-c9d8-42a3-8782-36b417858c65

思った通り。

拡張機能なしの場合

With A as (
SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring) uuid
)
select * from A 
union all
select * from A
uuid_in
f9b39ae5-f844-416e-89ef-6203b72d57a0
f9b39ae5-f844-416e-89ef-6203b72d57a0

思った通り。

ちなみに

uuidでは一意化できなかったので、rank関数を代替で使用した

Discussion