IT

Postgres for Insert 문에서 UUID를 생성하시겠습니까?

itgroup 2023. 5. 18. 20:57
반응형

Postgres for Insert 문에서 UUID를 생성하시겠습니까?

제 질문은 꽤 간단합니다.UUID의 개념을 알고 있으며 DB의 '스토어'에서 각 '항목'을 참조할 UUID를 생성하려고 합니다.합리적인 것 같습니까?

문제는 다음 행이 오류를 반환한다는 것입니다.

honeydb=# insert into items values(
uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
ERROR:  function uuid_generate_v4() does not exist
LINE 2: uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
        ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

저는 http://www.postgresql.org/docs/current/static/uuid-ossp.html 의 페이지를 읽었습니다.

Ubuntu 10.04 x64에서 Postgres 8.4를 실행하고 있습니다.

uuid-ossp기여 모듈이므로 기본적으로 서버에 로드되지 않습니다.사용하려면 데이터베이스에 파일을 로드해야 합니다.

현대적인 Postgre를 위하여.간편한 SQL 버전(9.1 이상):

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

그러나 9.0 이하의 경우 SQL 스크립트를 실행하여 확장을 로드해야 합니다.8.4의 기여 모듈에 대한 설명서를 참조하십시오.

9.1 페이지 이상의 경우 현재 기여 문서 및 를 읽어보십시오.이러한 기능은 8.4와 같은 9.0 이전 버전에는 없습니다.

패키지 버전의 Postgre를 사용하는 경우SQL 기여 모듈 및 확장을 포함하는 별도의 패키지를 설치해야 할 수 있습니다.패키지 관리자 데이터베이스에서 'postgres' 및 'contrib'을 검색합니다.

연장 없음(부정행위)

올바른 v4 UUID가 필요한 경우

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);

여기에 이미지 설명 입력

  • @Denis Stafichuk @Karsten@autronix 덕분입니다.

또는 다음을 수행하여 UUID와 유사한 값을 얻을 수 있습니다(유효성이 중요하지 않은 경우).

SELECT uuid_in(md5(random()::text || random()::text)::cstring);

output>> c2d29867-3d0b-d497-9191-18a9d8ee7830

(8.4 이상에서 작동)

PostgreSQL 13은 기본적으로 gen_random_uuid()지원합니다.

PostgreSQL에는 UUID를 생성하는 다음과 같은 함수가 포함되어 있습니다.

gen_random_uuid () → uuid

이 함수는 버전 4(임의) UUID를 반환합니다.이것은 가장 일반적으로 사용되는 UUID 유형이며 대부분의 애플리케이션에 적합합니다.

db<>디플 데모

크레이그 링거의 답은 맞습니다.Postgres 9.1 이상 버전에 대한 자세한 정보는 다음과 같습니다.

확장을 사용할 수 있습니까?

Postgres 설치(Postgreslingo의 클러스터)를 위해 확장이 이미 구축된 경우에만 확장을 설치할 수 있습니다.예를 들어, EnterpriseDB.com 에서 친절하게 제공하는 Mac OS X용 설치 관리자의 일부로 포함된 uuid-ossp 확장을 찾았습니다.수십 개의 내선 중 원하는 것을 사용할 수 있습니다.

Postgres 클러스터에서 uuid-osp 확장을 사용할 수 있는지 확인하려면 다음 SQL을 실행하여 시스템 카탈로그를 쿼리합니다.

SELECT * FROM pg_available_extensions;

확장 설치

UUID 관련 확장을 설치하려면 다음 SQL에 나와 있는 것처럼 CREATE EXTENSION 명령을 사용합니다.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

주의: 나는 내선번호 이름 주위에 따옴표 문자가 필요하다는 것을 알게 되었습니다. 반대의 문서에도 불구하고 말입니다.

SQL 표준 위원회 또는 Postgres 팀이 해당 명령에 대해 이상한 이름을 선택했습니다.제 생각에는 "설치 확장" 또는 "사용 확장"과 같은 것을 선택했어야 합니다.

설치 확인

다음 SQL을 실행하여 시스템 카탈로그를 쿼리하여 확장이 원하는 데이터베이스에 성공적으로 설치되었는지 확인할 수 있습니다.

SELECT * FROM pg_extension;

UUID를 기본값으로 지정

자세한 내용은 다음 질문을 참조하십시오.Postgres의 UUID 열에 대한 기본값

올드 웨이

위의 정보는 Postgres 9.1에 추가된 새로운 확장 기능을 사용합니다.이전 버전에서는 .sql 파일에서 스크립트를 찾아 실행해야 했습니다.확장 기능은 설치를 더 쉽게 하기 위해 추가되었으며, 확장 사용자/소비자의 작업량을 줄이면서 확장 작성자의 작업량을 늘릴 수 있습니다.자세한 내용은 블로그 게시물을 참조하십시오.

UUID 유형

그런데 질문의 코드가 함수를 호출합니다.uuid_generate_v4()이것은 버전 4로 알려진 유형을 생성하며 거의 모든 128비트가 무작위로 생성됩니다.더 작은 행 집합에서 제한적으로 사용하는 것은 괜찮지만 충돌 가능성을 사실상 제거하려면 다른 "버전"의 UUID를 사용하십시오.

예를 들어 원래 버전 1은 호스트 컴퓨터의 MAC 주소를 현재 날짜 및 임의의 숫자와 결합하므로 충돌 가능성은 거의 없습니다.

자세한 내용은 관련 질문에 대한 내 답변을 참조하십시오.

pgcrypto내선번호

9, Postgres 9.4 준으로기,pgcrypto모듈에는 이 기능이 포함되어 있습니다.이 함수는 난수 기반 버전 4 UUID 유형 중 하나를 생성합니다.

아직 사용할 수 없는 경우 기여 모듈을 가져옵니다.

sudo apt-get install postgresql-contrib-9.4

사용하다pgcrypto모듈.

CREATE EXTENSION "pgcrypto";

gen_random_uuid()이제 기능을 사용할 수 있어야 합니다.

사용 예.

INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;


Postgres 문서 모듈에서 인용합니다.

참고: 임의로 생성된(버전 4) UUID만 필요한 경우 대신 pgcrypto 모듈의 gen_random_uuid() 함수를 사용하는 것이 좋습니다.

2021년부터 업데이트, 자동 생성을 위한 화려한 트릭이 필요 없습니다.uuidinsert진술.

한 가지만 하면 됩니다.

  1. 기본값 설정:DEFAULT gen_random_uuid ()당신에게uuid기둥.그게 다야.

예를 들어, 다음과 같은 테이블이 있습니다.

CREATE TABLE table_name (
    unique_id UUID DEFAULT gen_random_uuid (),
    first_name VARCHAR NOT NULL,
    last_name VARCHAR NOT NULL,
    email VARCHAR NOT NULL,
    phone VARCHAR,
    PRIMARY KEY (unique_id)
);

이제 UUID 값을 자동으로 삽입하는 작업을 수행할 필요가 없습니다.unique_id기둥.이미 기본값을 정의했기 때문입니다.다른 열에 삽입하는 것에 초점을 맞출 수 있습니다.postgresql당신을 돌봅니다.unique_id다음은 삽입문 예제입니다.

INSERT INTO table_name (first_name, last_name, email, phone) 
VALUES (
    'Beki',
    'Otaev',
    'beki@bekhruz.com',
    '123-456-123'
)

에 삽입할 수 없습니다.unique_id이미 처리된 바와 같이

다음과 같은 다른 확장자에 대해uuid-ossp포스트그레스의 기준에 만족하지 않으면 그것들을 가져올 수 있습니다.gen_random_uuid ()기능.대부분의 경우, 당신은 그것들을 착용하지 않아도 괜찮습니다.

ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

@ZuzEL님의 답변을 읽고 위의 코드를 컬럼 id의 기본값으로 사용하여 정상적으로 동작하고 있습니다.

UUID-ossp 모듈은 UUID(Universally Unique Identifier)를 생성하는 기능을 제공합니다.

uuid_generate_v1() 이 함수는 버전 1 UUID를 생성합니다.

  1. 확장 추가

"uuid-osp"가 없는 경우 확장 생성;

  1. 확장 확인

선택 * 페이지_확장에서 선택;

  1. 쿼리 실행

table_name(id, column1, column2, column3, ...) 값(uuid_generate_v1(), value1, value2, value3...);

테이블 데이터 확인

SELECT uuid_generate_v5(uuid_ns_url (), 'test');

언급URL : https://stackoverflow.com/questions/12505158/generating-a-uuid-in-postgres-for-insert-statement

반응형