ค่าเริ่มต้นสำหรับคอลัมน์ UUID ใน Postgres


67

ในPostgres 9.x สำหรับคอลัมน์ประเภทUUIDฉันจะระบุ UUID ที่จะสร้างโดยอัตโนมัติเป็นค่าเริ่มต้นสำหรับการแทรกแถวใด ๆ ได้อย่างไร

คำตอบ:


92

TL; DR

โทรหาDEFAULTเมื่อกำหนดคอลัมน์เพื่อเรียกใช้ฟังก์ชันuuid OSSPอย่างใดอย่างหนึ่ง เซิร์ฟเวอร์ Postgres จะเรียกใช้ฟังก์ชันโดยอัตโนมัติทุกครั้งที่มีการแทรกแถว

CREATE TABLE tbl 
(
  pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
  CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
)

ปลั๊กอินที่จำเป็นในการสร้าง UUID

ในขณะที่Postgres out-of-the-box รองรับการจัดเก็บค่า UUID (Universally Unique Identifier)ในรูปแบบ128 บิตดั้งเดิมการสร้างค่า UUID ต้องใช้ปลั๊กอิน ใน Postgres, plug-in extensionเป็นที่รู้จักกันในฐานะที่เป็น

CREATE EXTENSIONการติดตั้งส่วนขยายโทร IF NOT EXISTSเพื่อหลีกเลี่ยงการติดตั้งใหม่เพิ่ม ดูโพสต์บล็อกของฉันสำหรับรายละเอียดเพิ่มเติมหรือดูหน้านี้ใน StackOverflow

นามสกุลที่เราต้องการเป็นห้องสมุดเปิดแหล่งที่มาสร้างใน C สำหรับการทำงานกับ UUIDs, OSSP uuid สร้างห้องสมุดนี้ Postgresมักจะมาพร้อมกับการติดตั้ง Postgres ดังกล่าวเป็นผู้ติดตั้งกราฟิกที่ให้บริการโดยองค์กร DBหรือรวมโดยผู้ให้บริการคลาวด์เช่นAmazon RDS สำหรับ PostgreSQL

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

การสร้าง UUID หลากหลายชนิด

ดูเอกสารของส่วนขยายเพื่อดูรายการคำสั่งหลายคำสั่งที่มีให้สำหรับการสร้างค่า UUID ประเภทต่างๆ ที่จะได้รับรุ่นเดิมของ UUID สร้างขึ้นจากคอมพิวเตอร์ที่อยู่ MACuuid_generate_v1()บวกปัจจุบันวันที่เวลาบวกค่าสุ่มเล็กโทร

SELECT uuid_generate_v1();

672124b6-9894-11e5-be38-001d42e813fe

ชุดรูปแบบต่อมาของชุดรูปแบบนี้ได้รับการพัฒนาสำหรับ UUID ชนิดอื่น บางคนอาจไม่ต้องการบันทึกที่อยู่ MAC ที่แท้จริงของเซิร์ฟเวอร์ตัวอย่างเช่นเพื่อความปลอดภัยหรือความเป็นส่วนตัว นามสกุล Postgres สร้างห้าชนิดของ UUIDs บวก“ศูนย์” 00000000-0000-0000-0000-000000000000UUID

UUID เป็นค่าเริ่มต้น

การเรียกเมธอดนั้นสามารถดำเนินการโดยอัตโนมัติเพื่อสร้างค่าเริ่มต้นสำหรับแถวที่แทรกใหม่ เมื่อกำหนดคอลัมน์ให้ระบุ:

DEFAULT uuid_generate_v1()

ดูคำสั่งที่ใช้ในคำนิยามตารางตัวอย่างต่อไปนี้

CREATE TABLE public.pet_
(
  species_ text NOT NULL,
  name_ text NOT NULL,
  date_of_birth_ text NOT NULL,
  uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),  -- <====
  CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.pet_
  OWNER TO postgres;

รุ่น UUID

uuid-osspปลั๊กอินสามารถสร้างรุ่นต่างๆของ UUID

  • uuid_generate_v1()
    มีที่อยู่ MACของคอมพิวเตอร์ปัจจุบัน + ช่วงเวลาปัจจุบัน ใช้บ่อย แต่ควรหลีกเลี่ยงหากคุณมีความรู้สึกอ่อนไหวเกี่ยวกับการเปิดเผย MAC ของเซิร์ฟเวอร์ฐานข้อมูลของคุณหรือเวลาที่สร้างค่านี้ ที่กำหนดโดยสเปคเป็นรุ่น 1 UUID
  • uuid_generate_v1mc()
    เช่นเดียวกับรุ่น 1แต่ใช้ที่อยู่ MAC แบบหลายผู้รับแบบสุ่มแทนที่อยู่ MAC จริง เห็นได้ชัดว่าเป็นวิธีการใช้เวอร์ชัน 1 แต่แทนที่ MAC อื่นแทนที่จะเป็น MAC จริงของเซิร์ฟเวอร์ฐานข้อมูลของคุณหากคุณมีความรู้สึกอ่อนไหวเกี่ยวกับการเปิดเผยข้อเท็จจริงดังกล่าว
    'มัลติคาสต์สุ่ม MAC' คืออะไร ผมไม่ทราบว่า หลังจากอ่านส่วน 4.1.6 ของRFC 4122ฉันสงสัยว่านี่เป็นตัวเลขสุ่มที่ใช้แทน MAC แต่ด้วยบิตที่ตั้งค่าเพื่อระบุที่อยู่ MAC แบบหลายผู้รับแทนที่จะเป็นแบบ unicast ปกติเพื่อแยกความแตกต่างของรุ่นที่ 1 นี้จากปกติ UUID จริงของ MAC เวอร์ชัน 1
  • uuid_generate_v3( namespace uuid, name text )
    มีแฮชMD5 ของข้อความที่คุณให้ นิยามโดยข้อกำหนดเป็นUUID เวอร์ชัน 3 , UUID เนมสเปซที่ใช้
  • uuid_generate_v4()
    อ้างอิงจากข้อมูลที่สร้างแบบสุ่มสำหรับ 121-122 จาก 128 บิต หกหรือเจ็ดบิตใช้เพื่อระบุ Version & Variant ชนิดของ UUID นี้เป็นจริงเฉพาะในกรณีที่นำมาใช้กับเครื่องกำเนิดไฟฟ้าแบบสุ่มเข้ารหัสที่แข็งแกร่ง ที่กำหนดโดยสเปคเป็นรุ่นที่ 4 UUID
  • uuid_generate_v5( namespace uuid, name text )
    เหมือนกับ Version 3 แต่ใช้การแฮชSHA1 ที่กำหนดโดยสเปคเป็นรุ่นที่ 5 UUID
  • uuid_nil()
    00000000-0000-0000-0000-000000000000เป็นกรณีพิเศษทุกบิตตั้งค่าเป็นศูนย์ ใช้เป็นแฟล็กสำหรับค่า UUID ที่ไม่รู้จัก ที่รู้จักกันเป็นUUID ศูนย์

ในการเปรียบเทียบประเภทดูคำถามรุ่น UUID ที่จะใช้

หากคุณสงสัยเกี่ยวกับรุ่น 3 และ 5 โปรดดูคำถามนี้การสร้าง v5 UUID ชื่อและเนมสเปซคืออะไร? .

สำหรับการอภิปรายเพิ่มเติมโปรดดูคำตอบของฉันกับคำถามที่คล้ายกันและโพสต์บล็อกของฉันค่า UUID จาก JDBC เพื่อ Postgres


1,000,000 ครั้งใน Google สำหรับวิธีการสร้างคอลัมน์ประเภท UUID Zero ไม่มีค่าใช้จ่ายสำหรับวิธีการทำให้คิวรีคิวรี่แย่ลงโดย pk นั้น !! : - @
Clint Eastwood

@ClintEastwood คำตอบของฉันสำหรับคำถามที่คล้ายกันและบล็อกของฉันโพสต์ค่า UUID จาก JDBC ถึง Postgresอาจช่วยคุณได้ หากสิ่งเหล่านี้พิสูจน์แล้วว่าไม่เพียงพอให้โพสต์คำถามใหม่ ฉันยินดีที่จะแทงอีกครั้ง ฉันเข้าใจความคับข้องใจของคุณ!
Basil Bourque

@ClintEastwood: ไวยากรณ์เพื่อเปรียบเทียบคอลัมน์ UUID ที่มีค่าต่อไปนี้ไวยากรณ์สำหรับค่าคงที่บันทึกไว้ในคู่มือการใช้งาน: postgresql.org/docs/current/static/...และประเภทปลดเปลื้อง: postgresql.org/docs/current/static/...
a_horse_with_no_name

1
@BasilBourque: ไม่จำเป็นจริงๆที่จะส่งผลให้getObject()คุณสามารถใช้UUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name

1
@Rokit เพื่อตรวจสอบความแรงของตัวสร้างตัวเลขสุ่มให้ดูที่การใช้งานโอเพ่นซอร์สพื้นฐานที่ห่อด้วยส่วนขยาย Postgres นี้โครงการห้องสมุดOSSP uuidตามที่กล่าวไว้ในคำตอบของฉัน และโปรดจำไว้ว่า UUID เวอร์ชัน 4 ควรใช้เป็นทางเลือกสุดท้ายหากด้วยเหตุผลบางประการคุณไม่สามารถเลือกประเภทอื่นได้ โดยทั่วไปเลือกแรกของคุณควรจะเป็นรุ่น 1 ชนิดโดยเรียกอย่างใดอย่างหนึ่งหรือuuid_generate_v1 uuid_generate_v1mc
Basil Bourque

7

ส่วนขยายpgcrypto

เป็นเพียงคำตอบที่ละเอียดอ่อนของ Basil เพียงเล็กน้อย:

เนื่องจากปัจจุบันส่วนใหญ่ใช้pgcryptoแทนคุณuuid_generate_v1()สามารถใช้gen_random_uuid()สำหรับค่าUUID เวอร์ชัน 4

ก่อนอื่นให้เปิดใช้งานpgcryptoใน Postgres ของคุณ

CREATE EXTENSION "pgcrypto";

เพียงแค่ตั้งค่าเริ่มต้นของคอลัมน์เป็น DEFAULT gen_random_uuid()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.