복붙노트

[SQL] SQL, 포스트 그레스 OID를, 그들이 무엇이고 왜 유용?

SQL

SQL, 포스트 그레스 OID를, 그들이 무엇이고 왜 유용?

좀 PostgreSQL의 테이블 작성보고, 그리고 난이 우연히 :

CREATE TABLE (
...
) WITH ( OIDS = FALSE );

나는 포스트 그레스에서 제공하는 설명서를 읽고 난 OOP에서의 객체 식별자의 개념을 알고 있지만 여전히 나는 이해하지 않는다

해결법

  1. ==============================

    1.OID를 기본적으로 당신에게 줄 내장 (사용자 공간 컬럼 반대) 시스템 컬럼에 포함 된 모든 행에 대해, 전 세계적으로 고유 ID. 즉, 당신이 두 개의 동일한 행이있는 테이블이있는 경우, 예를 들어 등 중복 행을 가지고, 당신은 두 가지의 가장 오래된을 삭제하려면, 기본 키가없는 테이블에 대한 편리합니다, 당신은을 사용하는 것을 할 수 OID 열입니다.

    OID를 기본적으로 당신에게 줄 내장 (사용자 공간 컬럼 반대) 시스템 컬럼에 포함 된 모든 행에 대해, 전 세계적으로 고유 ID. 즉, 당신이 두 개의 동일한 행이있는 테이블이있는 경우, 예를 들어 등 중복 행을 가지고, 당신은 두 가지의 가장 오래된을 삭제하려면, 기본 키가없는 테이블에 대한 편리합니다, 당신은을 사용하는 것을 할 수 OID 열입니다.

    (그들이있는 거 비표준 때문에 아마도 부분적으로), 그 사용은 기본적으로 사용되지 않습니다 내 경험에 의하면,이 기능은 대부분의 포스트 그레스 - 백업 애플리케이션에서 일반적으로 사용되지 않는 :

  2. ==============================

    2.(어떤 사람들은 큰 개체는 일반적으로 유용 어쨌든없는 주장하지만) OID의 대형 개체와 포스트 그레스에 대한 계속 사용합니다. 또한 시스템 테이블에서 광범위하게 사용된다. 그들은 모든 테이블에서 기본적으로 사용되는 별도의 저장 영역 (투명) 오프 8킬로바이트 BYTEA의 (등)에 비해 어떤 상점 큰 TOAST에 의해 예를 들어 사용됩니다. "정상"사용자 테이블과 관련된 이들의 직접 사용은 기본적으로 사용되지 않습니다.

    (어떤 사람들은 큰 개체는 일반적으로 유용 어쨌든없는 주장하지만) OID의 대형 개체와 포스트 그레스에 대한 계속 사용합니다. 또한 시스템 테이블에서 광범위하게 사용된다. 그들은 모든 테이블에서 기본적으로 사용되는 별도의 저장 영역 (투명) 오프 8킬로바이트 BYTEA의 (등)에 비해 어떤 상점 큰 TOAST에 의해 예를 들어 사용됩니다. "정상"사용자 테이블과 관련된 이들의 직접 사용은 기본적으로 사용되지 않습니다.

    분명히 OID 순서는 그것이 포장 할 수있는 글로벌 카운터의 본질 (b) 6. 그래서를 초과 랩하는 경우 "않습니다". 이 랩 않는 경우가 사용되는 경우, 일부 둔화가 발생 시작할 수 등 고유 값에 대해 "검색"

    또한 https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F 참조

  3. ==============================

    3.포스트 그레스를 담당하는 핵심 팀은 점차 OID를을 단계적으로한다.

    포스트 그레스를 담당하는 핵심 팀은 점차 OID를을 단계적으로한다.

    당신의 테이블에 옵션 시스템 열과 OID의 사용은 이제 포스트 그레스 (12) 할 수 있습니다 더 이상 사용에서 제거됩니다 :

    포스트 그레스 (12)의 데이터 유형 OID 남아 당신은 명시 적으로 형 OID의 열을 생성 할 수 있습니다.

    포스트 그레스 (12)로 이주한 후, 어떤 선택적으로 정의 된 시스템 열 OID는 더 이상 기본적으로 눈에 보이지 않는 수 없습니다. 는 SELECT *를 수행 지금이 열을 포함 할 것이다. 이 여분의 "놀라운"열이 순진 작성 SQL 코드를 깰 수도 있습니다.

  4. ==============================

    4.데이터베이스 테이블에서 모든 OID를 제거하려면이 리눅스 스크립트를 사용할 수 있습니다 :

    데이터베이스 테이블에서 모든 OID를 제거하려면이 리눅스 스크립트를 사용할 수 있습니다 :

    첫째, PostgreSQL의 수퍼 유저로 로그인 :

    sudo su postgres
    

    이제 데이터베이스 이름으로 YOUR_DATABASE_NAME을 변경,이 스크립트를 실행 :

    for tbl in `psql -qAt -c "select schemaname || '.' || tablename from pg_tables WHERE schemaname <> 'pg_catalog' AND schemaname <> 'information_schema';" YOUR_DATABASE_NAME` ; do  psql -c "alter table $tbl SET WITHOUT OIDS" YOUR_DATABASE_NAME ; done
    

    나는 Npgsql 3.0이 작동하지 않기 때문에, 내 모든 OID를 제거하려면이 스크립트를 사용하고, 더 이상 PostgreSQL을에 중요하지 않습니다.

  5. from https://stackoverflow.com/questions/5625585/sql-postgres-oids-what-are-they-and-why-are-they-useful by cc-by-sa and MIT license