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.