PostgreSQL 스키마 이름의 유효한 형식은 무엇입니까?


14

PostgreSQL 스키마 이름의 유효한 형식을 설명하는 설명서를 찾을 수 없습니다. 스키마 이름은 다음을 수행 할 수 없습니다.

  • 숫자로 시작하다
  • 공백이있다
  • ~로 시작하다 pg_

또 뭐요? 어디를 봐야합니까?

답변:


17

미세의 당 문서 , 나는 생각 이 당신이 찾고있는 무슨 수 있습니다.

SQL ID 및 키워드는 문자 (az, 분음 부호 및 비 라틴 문자가있는 문자) 또는 밑줄 (_)로 시작해야합니다. 식별자 또는 키워드의 후속 문자는 문자, 밑줄, 숫자 (0-9) 또는 달러 기호 ($) 일 수 있습니다. SQL 표준의 문자에 따라 식별자에 달러 기호를 사용할 수 없으므로 사용하면 응용 프로그램의 이식성이 떨어질 수 있습니다 ...


감사. 이 지시 사항을 따라 올바른 스키마 이름인지 확인합니다. 그렇다면이를 수락하겠습니다.

pg_Nathan C에서 언급 한 것처럼 해당 링크 에 밑줄 을 추가 할 수 있습니다 .
Ramon Tayag 1

5

documentation 에 따르면 pg_예약 된대로 시작할 수도 없습니다 . 그 외에는 상당히 자유 로워 보입니다.


감사합니다. 명명 할 수없는 스키마 목록에 추가하겠습니다. 불행히도, 그것은 유일한 규칙은 아닙니다. 이름을 this-is schema지정할 수 있으며 여전히 유효하지 않은 스키마 이름입니다.

3
@Ramon : this-is 또는 this-is 스키마 는 엄밀히 말하면 유효한 스키마 이름입니다. 당신은 혼란 것으로 보인다 유효 무엇인지이를 인용해야 할 때 .
Daniel Vérité

그렇습니다. 이것에 대해 살펴 보겠습니다.
Ramon Tayag

3

정답은 gsiems에서 제공하는 것입니다. 그러나 PostgreSQL에는 명심해야 할 인용 식별자에 대한 규칙이 있습니다. "따옴표 붙은 식별자는 코드가 0 인 문자를 제외한 모든 문자를 포함 할 수 있습니다. (큰 따옴표를 포함하려면 두 개의 큰 따옴표를 쓰십시오.)"... 보려는 경우에 대한 제한도 있습니다.

따라서 식별자를 인용하려는 경우 원하는 문자를 사용할 수 있습니다 (\ 0 제외). 그러나 식별자를 인용하지 않으면 해당 페이지에 요약 된 규칙을 따라야합니다.

나는 주로 인용하기 때문에 이것을 지적하고 싶었다. 특히 인용되지 않은 식별자의 케이스에 관한 규칙 (그리고 스키마 이름은 식별자로 계산된다).

최신 정보:

예를 들어 (스키마 식별자에는 적용 할 수 없지만 동일하게 적용 할 수 있음) :

    DROP TABLE "tbluser"; -- assuming it exists
    DROP TABLE "TBLUSER"; -- assuming it exists; incidentally, they are two different tables
    CREATE TABLE "TBLUSER" ( username text ); 
    INSERT INTO "TBLUSER" VALUES ( 'joe' ); 
    SELECT * FROM TBLUSER; -- this returns an error that the tbluser relation does not exist
    SELECT * FROM "TBLUSER"; -- works fine

이것은 PostgreSQL (그리고 아마도 SQL 표준)에 경험이있는 사람들에게는 예상되는 행동 일 수 있지만 PG를 처음 사용하고 다른 데이터베이스 서버 (예 : SQL Server 또는 Oracle)의 관점에서 오는 사람은이 행동에 부딪 칠 수 있습니다. 그들이 방금 만든 테이블이없는 이유가 궁금합니다.

아마도 일부 매뉴얼은 인용 식별자 사용을 권장하지 않지만 중요한 사실은 인용 식별자를 사용할 있고 사용할 있다는 것입니다. 또한 많은 패키지는 인용되지 않은 관계를 생성하고 액세스 할 때 항상 인용 식별자를 사용하는 정책으로 만듭니다. 소문자 (예 : PGAdmin III).

예를 들어, UI를 통해 테이블을 생성 할 때 PGAdmin III에서 생성 한 스크립트입니다.

    CREATE TABLE public."TBLUSER"
    (
      username text
    ) 
    WITH (
      OIDS = FALSE
    )
    ;

따라서 사용자가 쿼리에서이 테이블에 액세스 할 수있는 유일한 방법은 인용 된 식별자, 즉를 참조하는 것 "TBLUSER"입니다. 인용 부호가없는 식별자로 쿼리에서이 테이블에 액세스하려고하면 관계를 찾을 수 없습니다 (예 :) TBLUSER.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Paul White 9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.