Postgres에서 UUID 열의 기본값


답변:


92

tl; dr

전화 DEFAULT중 하나를 호출 할 수있는 열을 정의 할 때 OSSP의 UUID의 기능을. Postgres 서버는 행이 삽입 될 때마다 자동으로 함수를 호출합니다.

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

UUID를 생성하는 데 필요한 플러그인

반면 포스트 그레스 밖 박스 지원 저장 UUID (범용 고유 식별자) 자신 고유의 값을 128 비트 , 형태 발생 UUID 값은 플러그 - 인을 요구한다. Postgres에서 플러그인은로 알려져 있습니다 extension.

확장 프로그램을 설치하려면을 호출하십시오 CREATE EXTENSION. 다시 설치하지 않으려면을 추가하십시오 IF NOT EXISTS. 자세한 내용은 내 블로그 게시물 을 참조하거나 StackOverflow에서이 페이지를 참조하십시오 .

우리가 원하는 확장은 UUID, OSSP uuid 작업을 위해 C로 빌드 된 오픈 소스 라이브러리 입니다. 포스트 그레스이 라이브러리의 빌드는 종종 같은로 포스트 그레스의 설치와 함께 제공됩니다 제공하는 그래픽 설치 프로그램 에 의해 엔터프라이즈 DB 와 같은 클라우드 제공 업체 또는 포함 PostgreSQL를위한 아마존 RDS .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

다양한 종류의 UUID 생성

참고 항목 확장의 문서 UUID 값의 다양한 종류를 생성하기 위해 제공되는 여러 명령의 목록을 볼 수 있습니다. 컴퓨터의 MAC 주소 와 현재 날짜-시간 및 작은 임의의 값으로 빌드 된 UUID의 원래 버전을 얻으려면을 호출하십시오 uuid_generate_v1().

SELECT uuid_generate_v1();

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

이 테마의 이후 변형은 대체 종류의 UUID를 위해 개발되었습니다. 예를 들어 보안 또는 개인 정보 보호를 위해 서버의 실제 MAC 주소를 기록하지 않는 사람들이있을 수 있습니다. Postgres 확장 프로그램은 5 가지 종류의 UUID와 "nil"UUID를 생성 00000000-0000-0000-0000-000000000000합니다.

기본값으로 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'이란 무엇입니까? 나는 정확히 모른다 . RFC 4122 의 섹션 4.1.6을 읽은 후에 는 MAC 대신 임의의 숫자이지만 비트 1이 일반적인 유니 캐스트 대신 멀티 캐스트 MAC 주소를 나타내도록 설정되어 버전 1의 변형을 일반적인 것과 구별합니다. 실제 MAC 버전 1 UUID.
  • uuid_generate_v3( namespace uuid, name text )
    제공 한 MD5 텍스트 해시 가 포함되어 있습니다 . A와 사양에 의해 정의 버전 3 UUID , 네임 스페이스는 UUID 기반.
  • uuid_generate_v4()
    128 비트 중 121-122에 대해 무작위로 생성 된 데이터를 기반으로합니다. 버전 및 변형을 나타내는 데 사용되는 6 또는 7 비트 . 이러한 종류의 UUID는 암호로 강력한 임의 생성기로 구현 된 경우에만 실용적 입니다. 사양에 따라 버전 4 UUID 로 정의됩니다 .
  • uuid_generate_v5( namespace uuid, name text )
    버전 3과 동일하지만 SHA1 해싱을 사용합니다. 사양에 따라 버전 5 UUID 로 정의됩니다 .
  • uuid_nil()
    특별한 경우, 모든 비트는 0으로 설정됩니다 00000000-0000-0000-0000-000000000000. 알 수없는 UUID 값에 대한 플래그로 사용됩니다. A와 알려진 전무 UUID .

유형을 비교하려면 질문, 어떤 UUID 버전을 사용해야합니까?를 참조하십시오 .

버전 3 및 5가 궁금하다면이 질문, v5 UUID 생성을 참조하십시오 . 이름과 네임 스페이스 란 무엇입니까? .

더 설명을 참조 내 대답 비슷한 질문에 내 블로그 게시물 포스트 그레스에 JDBC에서 UUID 값을 .


UUID 유형의 열을 만드는 방법에 대해 Google에서 1,000,000 개의 조회수가 발생했습니다. 그 pk로 쿼리 행을 괴롭히는 방법에 대한 제로 히트! :-@
클린트 이스트우드

@ClintEastwood 비슷한 질문에 대한 나의 대답JDBC에서 Postgres 로의 블로그 게시물 UUID 값 이 도움이 될 수 있습니다. 충분하지 않은 것으로 판명되면 새로운 질문을 게시하십시오. 나는 그것에 또 다른 찌르기를 기뻐할 것입니다. 나는 당신의 좌절을 이해합니다!
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 라이브러리 프로젝트에 의해 감싸 인 기본 오픈 소스 구현을 살펴보십시오 . 어떤 이유로 다른 유형을 선택할 수없는 경우 버전 4 UUID는 최후의 수단으로 만 사용해야합니다. 일반적으로, 첫 번째 선택이 중 하나를 호출하여 버전 1 종류해야 uuid_generate_v1하거나 uuid_generate_v1mc.
바질 부르 케

7

pgcrypto 확장

Basil의 매우 자세한 답변에 약간의 추가 사항이 있습니다.

현재 때문에 대부분 사용하는 pgcrypto를 대신, uuid_generate_v1()당신이 사용할 수있는 gen_random_uuid()A의 버전 4 UUID의 값입니다.

먼저 Postgres에서 pgcrypto 를 활성화 하십시오.

CREATE EXTENSION "pgcrypto";

열의 DEFAULT를 다음으로 설정하십시오. DEFAULT gen_random_uuid()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.