ฉันไม่พบเอกสารที่อธิบายรูปแบบที่ถูกต้องของชื่อสกีมา PostgreSQL ฉันรู้ว่าชื่อสคีมาไม่สามารถ:
- เริ่มต้นด้วยตัวเลข
- มีช่องว่าง
- เริ่มกับ
pg_
มีอะไรอีกบ้าง? ฉันควรมองที่ไหน
ฉันไม่พบเอกสารที่อธิบายรูปแบบที่ถูกต้องของชื่อสกีมา PostgreSQL ฉันรู้ว่าชื่อสคีมาไม่สามารถ:
pg_
มีอะไรอีกบ้าง? ฉันควรมองที่ไหน
คำตอบ:
ตามเอกสารที่ดีฉันคิดว่านี่อาจเป็นสิ่งที่คุณกำลังมองหา
ตัวระบุ SQL และคำสำคัญจะต้องเริ่มต้นด้วยตัวอักษร (az แต่ตัวอักษรที่มีเครื่องหมายกำกับเสียงและตัวอักษรที่ไม่ใช่ละติน) หรือเครื่องหมายขีดล่าง (_) อักขระที่ตามมาในตัวระบุหรือคำสำคัญอาจเป็นตัวอักษรขีดล่างตัวเลข (0-9) หรือเครื่องหมายดอลลาร์ ($) โปรดทราบว่าไม่อนุญาตให้ใช้เครื่องหมายดอลลาร์ในตัวระบุตามตัวอักษรของมาตรฐาน SQL ดังนั้นการใช้งานของพวกเขาอาจทำให้แอปพลิเคชันพกพาได้น้อยลง ...
ตามเอกสารมันไม่สามารถเริ่มต้นด้วยpg_
มันสงวนไว้ นอกเหนือจากนั้นมันก็ดูอิสระ
this-is schema
และมันจะยังคงเป็นชื่อสคีมาที่ไม่ถูกต้อง
คำตอบที่ถูกต้องคือคำตอบที่ได้จาก gsiems อย่างไรก็ตามฉันต้องการชี้ให้เห็นว่า PostgreSQL มีกฎเกณฑ์เกี่ยวกับตัวระบุที่อ้างถึงซึ่งคุณอาจต้องคำนึงถึง "ตัวระบุที่อ้างถึงสามารถมีอักขระใด ๆ ยกเว้นอักขระที่มีรหัสเป็นศูนย์ (หากต้องการใส่เครื่องหมายอัญประกาศคู่ให้เขียนเครื่องหมายคำพูดคู่สองตัว)" ... นอกจากนี้ยังมีข้อ จำกัด บางประการในกรณีที่คุณอาจต้องการดู
ดังนั้นหากคุณจะอ้างตัวระบุของคุณคุณสามารถใช้อักขระใด ๆ ที่คุณต้องการ (ยกเว้น \ 0) แต่หากคุณไม่ได้ระบุตัวตนของคุณคุณต้องปฏิบัติตามกฎที่ระบุไว้ในหน้านั้น
ฉันต้องการที่จะชี้ให้เห็นสิ่งนี้เป็นหลักเพราะมันกัดฉันก่อนโดยเฉพาะอย่างยิ่งกฎที่เกี่ยวข้องกับกรณีในตัวระบุที่ไม่ได้อ้างถึง (และชื่อสคีมานับเป็นตัวระบุ)
UPDATE:
เป็นตัวอย่าง (ไม่สามารถใช้ได้กับตัวระบุสกีมา แต่ใช้กับพวกมันได้อย่างเท่าเทียมกัน):
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 หรือ Oracle) อาจชนกับพฤติกรรมนี้ สงสัยว่าทำไมตารางที่พวกเขาเพิ่งสร้างหายไป
บางทีคู่มือบางเล่มอาจแนะนำให้ใช้ตัวระบุที่ยกมา แต่ข้อเท็จจริงของเรื่องนี้ก็คือตัวระบุที่เสนอราคานั้นสามารถใช้งานได้และสามารถใช้งานได้และยิ่งไปกว่านั้นแพ็คเกจจำนวนมากทำให้มีนโยบายที่จะใช้ตัวระบุที่เสนอราคาเสมอ ตัวพิมพ์เล็กทั้งหมดเช่น PGAdmin III
ตัวอย่างเช่นนี่คือสคริปต์ที่สร้างโดย PGAdmin III เมื่อสร้างตารางผ่าน UI:
CREATE TABLE public."TBLUSER"
(
username text
)
WITH (
OIDS = FALSE
)
;
"TBLUSER"
ดังนั้นวิธีเดียวที่ผู้ใช้สามารถเข้าถึงตารางนี้ในแบบสอบถามโดยหมายถึงตัวบ่งชี้ที่ยกมาของมันคือ TBLUSER
พยายามที่จะใช้ตารางนี้ในแบบสอบถามที่มีไม่ใช่ยกมาระบุจะส่งผลให้ในความล้มเหลวในการค้นหาความสัมพันธ์คือ