จำกัด อินพุตให้กับสตริงที่ต่างกันเล็กน้อย


12

สวัสดีฉันไม่สามารถรับข้อ จำกัด ในการทำงานตามที่ฉันคาดหวังใน postgreSQL จากภายใน pgadmin ฉันรันเคียวรี SQL ต่อไปนี้

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" SIMILAR TO 'email|post|IRL|minutes');
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

เมื่อดำเนินการนี้จะถูกแปลงเป็น

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" ~ similar_escape('email|post|IRL|minutes'::text, NULL::text));
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

ฉันคาดว่าสิ่งนี้จะ จำกัด การป้อนข้อมูลของฉันสำหรับคอลัมน์ประเภทเป็นหนึ่งในโพสต์อีเมล IRL หรือนาที อย่างไรก็ตามเมื่อป้อนข้อมูลตารางข้อ จำกัด นี้ล้มเหลวเมื่อฉันป้อนหนึ่งในประเภทเหล่านี้ คอลัมน์ประเภทเป็นประเภทอักขระ ไม่มีใครรู้วิธีการที่จะแก้ไขปัญหานี้. ขอบคุณ


3
ถ้าฉันไม่เข้าใจบางสิ่งบางอย่างมีเหตุผลไหมที่การอ่านทำได้ง่ายกว่านี้CHECK (type in ('email','post','IRL','minutes')หรือไม่?
rfusca

คำตอบ:


16

เปลี่ยนข้อ จำกัด ของคุณเป็น

CHECK (type IN ('email','post','IRL','minutes'))

สิ่งนี้จะถูกแปลงโดยตัวแยกวิเคราะห์เป็น:

CHECK (type = ANY( ARRAY['email','post','IRL','minutes']))

นั่นควรทำสิ่งที่คุณกำลังดู

อย่างไรก็ตามฉันต้องสงสัยว่ามันจะไม่ดีกว่าที่จะทำสิ่งนี้:

CREATE TABLE comlog_types (
     type text
);

จากนั้นเพิ่มคีย์ต่างประเทศเพื่อบังคับใช้ข้อ จำกัด สิ่งนี้จะทำให้ง่ายต่อการเพิ่มประเภทในอนาคต


ขอบคุณที่แก้ไขได้อย่างสมบูรณ์ ฉันอาจเปลี่ยนไปใช้วิธีการต่างประเทศในอนาคต
wookie1

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