Apa format yang valid dari nama skema PostgreSQL?

14

Sepertinya saya tidak dapat menemukan dokumentasi yang menggambarkan format valid dari nama skema PostgreSQL. Saya tahu bahwa nama skema tidak dapat:

  • mulai dengan angka
  • punya ruang
  • dimulai dari pg_

Apa lagi? Di mana saya harus mencari?

Ramon Tayag
sumber

Jawaban:

17

Per dokumentasi yang bagus , saya pikir ini mungkin yang Anda cari.

Pengidentifikasi SQL dan kata-kata kunci harus dimulai dengan huruf (az, tetapi juga huruf dengan tanda diakritik dan huruf non-Latin) atau garis bawah (_). Karakter selanjutnya dalam pengidentifikasi atau kata kunci dapat berupa huruf, garis bawah, digit (0-9), atau tanda dolar ($). Perhatikan bahwa tanda dolar tidak diperbolehkan dalam pengidentifikasi sesuai dengan surat standar SQL, sehingga penggunaannya mungkin membuat aplikasi kurang portabel ...

gsiems
sumber
Terima kasih. Saya akan mengikuti instruksi ini dan melihat apakah itu adalah nama skema yang valid. Jika demikian, maka saya akan menerima ini.
Mungkin ingin menambahkan pg_garis bawah untuk link yang, seperti Nathan C disebutkan .
Ramon Tayag
5

Menurut dokumentasi , itu juga tidak dapat mulai dengan pg_seperti yang disediakan. Selain itu tampilannya cukup unik.

Nathan C
sumber
Terima kasih, saya akan menambahkan itu ke daftar skema apa yang tidak bisa disebutkan namanya. Sayangnya, itu bukan satu-satunya aturan. Saya bisa menamainya this-is schemadan itu masih akan menjadi nama skema yang tidak valid.
3
@Ramon: skema ini-ini atau ini-adalah nama skema yang valid, sebenarnya. Anda tampaknya akan membingungkan apa yang berlaku dengan ketika harus dikutip .
Daniel Vérité
Ya, Anda mungkin benar. Biarkan saya melihat ini.
Ramon Tayag
3

Jawaban yang benar adalah jawaban yang diberikan oleh para gadis. Namun, saya ingin menunjukkan bahwa PostgreSQL memiliki aturan pengenal yang dikutip yang mungkin perlu Anda ingat. "Pengidentifikasi yang dikutip dapat berisi karakter apa pun, kecuali karakter dengan kode nol. (Untuk memasukkan tanda kutip ganda, tulis dua tanda kutip ganda.)" ... Ada juga beberapa batasan pada kasus yang mungkin ingin Anda lihat.

Jadi, jika Anda akan mengutip pengidentifikasi Anda, maka Anda dapat menggunakan karakter apa pun yang Anda inginkan (dengan pengecualian \ 0). Tetapi jika Anda tidak mengutip pengidentifikasi Anda, Anda harus mengikuti aturan yang diuraikan di halaman itu.

Saya ingin menunjukkan ini terutama karena itu telah menggigit saya sebelumnya, terutama aturan mengenai kasus dalam pengidentifikasi yang tidak dikutip (dan nama skema dianggap sebagai pengidentifikasi).

MEMPERBARUI:

Sebagai contoh (tidak khusus berlaku untuk pengidentifikasi skema, tetapi juga berlaku untuk mereka):

    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

Ini mungkin perilaku yang diharapkan bagi mereka yang berpengalaman dengan PostgreSQL (dan mungkin standar SQL), tetapi seseorang yang baru mengenal PG dan berasal dari sudut pandang server basis data lain (SQL Server atau Oracle misalnya) mungkin bertabrakan dengan perilaku ini dan bertanya-tanya mengapa tabel yang baru mereka buat hilang.

Mungkin beberapa manual merekomendasikan untuk tidak menggunakan pengenal yang dikutip, tetapi faktanya adalah pengenal yang dikutip tersedia untuk digunakan dan dapat digunakan dan selanjutnya, banyak paket menjadikannya kebijakan untuk selalu menggunakan pengenal yang dikutip saat membuat dan mengakses hubungan yang tidak seluruhnya huruf kecil, misalnya, PGAdmin III.

Misalnya, ini adalah skrip yang dihasilkan oleh PGAdmin III saat membuat tabel melalui UI:

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

Oleh karena itu, satu-satunya cara pengguna dapat mengakses tabel ini dalam kueri adalah dengan merujuk ke pengenal yang dikutip, yaitu "TBLUSER",. Mencoba mengakses tabel ini dalam kueri dengan pengenal yang tidak dikutip akan mengakibatkan kegagalan untuk menemukan hubungan, yaitu TBLUSER,.

efesar
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Paul White 9