การหลีกเลี่ยงชื่อคอลัมน์ที่เหมือนคีย์เวิร์ดใน Postgres


135

ถ้าคอลัมน์ในตารางของ Postgres มีชื่อyearการINSERTค้นหาควรดูอย่างไรเพื่อตั้งค่าสำหรับคอลัมน์นั้น

เช่น: INSERT INTO table (id, name, year) VALUES ( ... );ให้ข้อผิดพลาดใกล้คำปี

คำตอบ:


212

เพียงใส่yearเครื่องหมายคำพูดคู่เพื่อหยุดการตีความเป็นคำหลัก :

INSERT INTO table (id, name, "year") VALUES ( ... );

จากเอกสารประกอบ :

มีตัวระบุประเภทที่สอง: ตัวระบุที่คั่นหรือตัวระบุที่ยกมา เกิดขึ้นจากการใส่ลำดับของอักขระโดยพลการในเครื่องหมายคำพูดคู่ (") ตัวระบุที่คั่นจะเป็นตัวระบุเสมอไม่ใช่คำสำคัญดังนั้น" select "จึงสามารถใช้เพื่ออ้างถึงคอลัมน์หรือตารางที่ชื่อ" select " ในขณะที่การเลือกที่ไม่ได้ใส่เครื่องหมายคำพูดจะถูกนำมาใช้เป็นคำสำคัญและจะทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์เมื่อใช้ในที่ที่คาดว่าจะมีชื่อตารางหรือคอลัมน์


44
คำเตือนบางประการ: หากไม่มีเครื่องหมายคำพูด PostgreSQL จะพับตัวระบุทั้งหมดเป็นตัวพิมพ์เล็ก MyTable, myTableและmytableมีเพียงเดียวกัน ด้วยเครื่องหมายคำพูดนี้ไม่สามารถพับได้ ดังนั้นไม่มากเช่นเดียวกับ"MyTable" mytable
AH

19
ยังดีกว่าอย่าใช้คำสงวนหรือกรณีผสมเป็นตัวระบุและคุณจะไม่ต้องใช้เครื่องหมายคำพูดคู่หรือรับข้อความแสดงข้อผิดพลาดแปลก ๆ
Erwin Brandstetter


8
@ErwinBrandstetter ปัญหาคือเมื่อคุณทำงานในโครงการที่จัดตั้งขึ้น
ceruleus

5
@ HoàngLongใช่เลย update "user" set "password" = 'value...';ทำงานได้ดีอย่างสมบูรณ์ ...
Phill

0

หากคุณไม่ได้ใส่เครื่องหมายคำพูดใน Fields / Columns ใด ๆ Postgres จะถูกลดขนาดโดยค่าเริ่มต้น และ Postgres จะข้ามการตรวจสอบคำหลักเมื่อพูดถึงชื่อคอลัมน์

ในกรณีของคุณฉันไม่คิดว่าจะต้องเพิ่มเครื่องหมายคำพูดเมื่อพูดถึงไฟล์columns. แต่ถ้าคุณกำลังใช้keywords(ลงทะเบียนโดย Postgres) เป็นชื่อของTable, Schema, FunctionหรือTriggerอื่น ๆ คุณต้องมีการใช้คำพูดสองอย่างใดอย่างหนึ่งหรือคุณสามารถระบุชื่อสกีมาด้วยจุดเรียงต่อกัน

สมมติว่าคำสั่งซื้อเป็นคำหลักที่ลงทะเบียนโดย Postgres และในบางสถานการณ์คุณต้องใช้คีย์เวิร์ดนี้เป็นชื่อตาราง

ในเวลานั้น Postgres จะอนุญาตให้คุณสร้างตารางด้วยkeywords. นั่นคือความสวยงามของ Postgres

หากต้องการเข้าถึงตารางคำสั่งซื้อคุณต้องใช้เครื่องหมายคำพูดคู่หรือคุณสามารถใช้ชื่อสคีมาก่อนชื่อตารางได้

เช่น

1

select * from schema_name.order;

2

select * from "order";

ในทำนองเดียวกันคุณสามารถใช้ชุดค่าผสมประเภทนี้ได้ หวังว่านี่จะช่วยคุณได้

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