รูปแบบที่ถูกต้องของชื่อสกีมา PostgreSQL คืออะไร


14

ฉันไม่พบเอกสารที่อธิบายรูปแบบที่ถูกต้องของชื่อสกีมา PostgreSQL ฉันรู้ว่าชื่อสคีมาไม่สามารถ:

  • เริ่มต้นด้วยตัวเลข
  • มีช่องว่าง
  • เริ่มกับ pg_

มีอะไรอีกบ้าง? ฉันควรมองที่ไหน

คำตอบ:


17

ตามเอกสารที่ดีฉันคิดว่านี่อาจเป็นสิ่งที่คุณกำลังมองหา

ตัวระบุ SQL และคำสำคัญจะต้องเริ่มต้นด้วยตัวอักษร (az แต่ตัวอักษรที่มีเครื่องหมายกำกับเสียงและตัวอักษรที่ไม่ใช่ละติน) หรือเครื่องหมายขีดล่าง (_) อักขระที่ตามมาในตัวระบุหรือคำสำคัญอาจเป็นตัวอักษรขีดล่างตัวเลข (0-9) หรือเครื่องหมายดอลลาร์ ($) โปรดทราบว่าไม่อนุญาตให้ใช้เครื่องหมายดอลลาร์ในตัวระบุตามตัวอักษรของมาตรฐาน SQL ดังนั้นการใช้งานของพวกเขาอาจทำให้แอปพลิเคชันพกพาได้น้อยลง ...


ขอบคุณ ฉันจะทำตามคำแนะนำเหล่านี้และดูว่าเป็นชื่อสคีมาที่ถูกต้องหรือไม่ ถ้าเป็นเช่นนั้นฉันจะยอมรับสิ่งนี้

อาจต้องการเพิ่มpg_ขีดไปยังลิงค์ที่เหมือนนาธานซีกล่าวถึง
Ramon Tayag

5

ตามเอกสารมันไม่สามารถเริ่มต้นด้วยpg_มันสงวนไว้ นอกเหนือจากนั้นมันก็ดูอิสระ


ขอบคุณฉันจะเพิ่มเข้าไปในรายการสิ่งที่ schema ไม่สามารถตั้งชื่อได้ น่าเสียดายที่มันไม่ใช่กฎเดียวเท่านั้น ฉันสามารถตั้งชื่อได้this-is schemaและมันจะยังคงเป็นชื่อสคีมาที่ไม่ถูกต้อง

3
@Ramon: นี่คือหรือนี่คือสคีมาเป็นชื่อสคีมาที่ถูกต้องพูดอย่างเคร่งครัด ดูเหมือนว่าคุณจะทำให้เกิดความสับสนในสิ่งที่ถูกต้องกับที่จะต้องมีที่ยกมา
Daniel Vérité

ใช่คุณอาจจะพูดถูก ขอดูหน่อยสิ
Ramon Tayag

3

คำตอบที่ถูกต้องคือคำตอบที่ได้จาก 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พยายามที่จะใช้ตารางนี้ในแบบสอบถามที่มีไม่ใช่ยกมาระบุจะส่งผลให้ในความล้มเหลวในการค้นหาความสัมพันธ์คือ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
พอลไวท์ 9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.