PostgreSQLスキーマ名の有効な形式は何ですか?


14

PostgreSQLスキーマ名の有効な形式を説明するドキュメントが見つからないようです。スキーマ名では次のことはできません。

  • 数字で始める
  • スペースがあります
  • 皮切りに pg_

ほかに何か?どこを見ればいいですか?

回答:


17

素晴らしいドキュメントによると、これはあなたが探しているものかもしれないと思います

SQL識別子とキーワードは、文字(az、または発音区別符号付きの文字と非ラテン文字)または下線(_)で始まる必要があります。識別子またはキーワードの後続の文字には、文字、アンダースコア、数字(0〜9)、またはドル記号($)を使用できます。ドル記号は、SQL標準の文字に従って識別子では許可されていないため、それらを使用するとアプリケーションの移植性が低下する可能性があることに注意してください...


ありがとう。これらの指示に従い、それらが有効なスキーマ名であるかどうかを確認します。もしそうなら、私はこれを受け入れます。

pg_Nathan Cが述べたように、そのリンクにアンダースコアを追加したいと思うかもしれません。
Ramon Tayag 2013

5

ドキュメントによると、pg_予約されているため、で開始することもできません。それ以外はかなりフリーフォームに見えます。


名前を付けることのできないスキーマのリストに追加します。残念ながら、それは明らかに唯一のルールではありません。名前を付けてthis-is schemaも、無効なスキーマ名のままです。

3
@Ramon:厳密に言えば、this-isまたはthis-isスキーマは有効なスキーマ名です。あなたはそれが引用されなければならないとき、何が有効であるかを混同しているようです。
DanielVérité2013

はい、あなたはおそらく正しいです。これを調べてみましょう。
Ramon Tayag 2013

3

正解は、gsiemsが提供するものです。ただし、PostgreSQLには、覚えておいてもよい引用された識別子に関するルールがあることを指摘しておきます。「引用符で囲まれた識別子には、コードがゼロの文字を除いて、任意の文字を含めることができます。(二重引用符を含めるには、2つの二重引用符を書きます。)」...見たい場合にも、いくつかの制限があります。

したがって、識別子を引用する場合は、\ 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


コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
ポールホワイト9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.