복붙노트

[SQL] 안전하게 이름 바꾸기 테이블 일련 기본 키 열을 사용하여

SQL

안전하게 이름 바꾸기 테이블 일련 기본 키 열을 사용하여

나는 암시 인덱스 순서와 제약으로 SERIAL 기본 키 말을 사용하는 PostgreSQL의 테이블이 PostgreSQL을에 의해 생성되는 것을 알고있다. 문제는 테이블 이름이 변경 될 때 이러한 내장 객체의 이름을 변경하는 방법입니다. 아래는 끝에서 특정 질문이 밖으로을 파악하려고 시도한이다.

테이블을 등을 감안할 때 :

CREATE TABLE foo (
    pkey SERIAL PRIMARY KEY,
    value INTEGER
);

포스트 그레스 출력 :

pgAdmin III SQL 창 쇼 (decluttered) 테이블에 대해 다음 DDL 스크립트 :

CREATE TABLE foo (
  pkey serial NOT NULL,
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE foo OWNER TO postgres;

이제 테이블의 이름을 변경 :

ALTER table foo RENAME TO bar;

pgAdmin III :

CREATE TABLE bar (
  pkey integer NOT NULL DEFAULT nextval('foo_pkey_seq'::regclass),
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;

여분의 DEFAULT의의 nextval ( 'foo_pkey_seq':: regclass 형), 테이블의 이름을 변경하면 기본 키의 순서의 이름을 변경하지만 지금 우리가이 명시의 nextval ()가 발생하지 않는 것을이 수단을합니다.

이제 순서의 이름을 변경 :

내가 노력 있도록 일관된 명명 데이터베이스를 유지하려면 :

ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;

pgAdmin III :

CREATE TABLE bar (
  pkey serial NOT NULL,
  value integer,
  CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;

NEXTVAL 기본값 ( 'foo_pkey_seq':: regclass 형)은 사라입니다.

해결법

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

    1.직렬 실제 데이터 타입이다. 수동 상태 :

    직렬 실제 데이터 타입이다. 수동 상태 :

    의사 데이터 유형은이 모든 일을 해결 :

    이 시스템은 사용자가 손으로 또는 의사 데이터 형식 일련의 방법으로이 모든 것을 한 여부를 알 수 없습니다. 이 모두 충족되면 나열된 기능에 pgAdmin 점검하고, 역 설계 DDL 스크립트가 일치하는 일련 유형으로 단순화된다. 기능 중 하나가 충족되지 않을 경우,이 단순화는 발생하지 않습니다. 즉 뭔가 pgAdmin가하는 것입니다. 기본 카탈로그 테이블의 경우는 모두 동일합니다. 같은 어떤 시리얼 타입은 없습니다.

    자동으로 소유 시퀀스의 이름을 바꿀 수있는 방법은 없습니다. 당신은 실행할 수 있습니다 :

    ALTER SEQUENCE ... RENAME TO ...
    

    같은 당신은 않았다. 시스템 자체는 이름에 대해 상관하지 않는다. OID에 체류 같은 - 열 DEFAULT 저장은 OID ( 'foo_pkey_seq':: regclass 형)는, 그 파괴하지 않고 시퀀스의 이름을 변경할 수 있습니다. 같은 외국 키와 데이터베이스 내부의 유사한 참조 간다.

    기본 키에 대한 암시 적 인덱스는 테이블의 이름을 변경하는 경우 변경되지 않습니다 PK 제약 조건의 이름에 바인딩됩니다. 포스트 그레스 9.2에서 또는 나중에 사용할 수 있습니다

    ALTER TABLE ... RENAME CONSTRAINT ..
    

    그것도를 해결합니다.

    또한 테이블 이름을 참조에 지정된 인덱스가있을 수 있습니다. 유사한 과정 :

    ALTER INDEX .. RENAME TO  ..
    

    당신은 테이블 이름에 대한 비공식적 인 참조 모든 종류의 수 있습니다. 이 시스템은 강제로 당신이 좋아하는 어떤 이름 할 수있는 개체의 이름을 바꿀 수 없습니다. 그리고 그것은 상관하지 않습니다.

    물론 당신은 무효화 SQL 코드 즉 참조 그 이름에 싶지 않아요. 물론, 당신은 응용 프로그램 논리 참조 그 동안 이름을 변경하지 않습니다. 사람들이 일반적으로 이름으로 참조되지 않기 때문에 일반적으로 이것은, 인덱스, 시퀀스 또는 제한의 이름에 대한 문제가되지 않을 것입니다.

    포스트 그레스는 그 이름을 변경하기 전에 객체에 대한 잠금을 획득합니다. 그 트랜잭션이 커밋 또는 롤 다시 때까지 그래서 문제의 객체에 대한 잠금의 종류가 동시 트랜잭션 열려있을 경우, 당신의 이름 바꾸기 작업이 정지되었습니다.

    데이터베이스 스키마는 시스템 스키마 pg_catalog의 시스템 카탈로그 테이블에 저장됩니다. 여기에 수동의 모든 세부 사항. 당신은 당신이 일을 정확히 모르는 경우에 모두 해당 테이블 덤비는하지 않아야합니다. 하나 개의 거짓 이동하고 당신은 당신의 데이터베이스를 중단 할 수 있습니다. DDL을 명령 포스트 그레스가 제공하는 사용합니다.

    가장 중요한 테이블 중 일부 포스트 그레스는 반대 신속하게 OID와 그의 이름을 얻기 위해 객체 식별자의 종류와 타입 캐스트를 제공합니다. 처럼:

    SELECT 'foo_pkey_seq'::regclass
    

    스키마 이름이 search_path의에 테이블 이름이 고유 경우에, 그것은 당신에게 같은 수 있습니다 :

    SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';
    

    대부분의 카탈로그 테이블의 기본 키는 OID이며, 내부적으로, 대부분의 참조는 OID를 사용합니다.

  2. from https://stackoverflow.com/questions/14649682/safely-rename-tables-using-serial-primary-key-columns by cc-by-sa and MIT license