จำกัด คอลัมน์ varchar () เฉพาะค่าหรือไม่


96

มีวิธีระบุค่าที่แตกต่างกันเช่น 4 ค่าสำหรับคอลัมน์ varchar ใน MS SQL Server 2008 หรือไม่

ตัวอย่างเช่นฉันต้องการคอลัมน์ที่เรียกว่าความถี่ (varchar) ที่ยอมรับเฉพาะค่า 'รายวัน', 'รายสัปดาห์', 'รายเดือน', 'รายปี' เท่านั้น

เป็นไปได้ไหมที่จะตั้งค่าภายในสตูดิโอจัดการเซิร์ฟเวอร์ SQL เมื่อสร้างตาราง


5
ถ้าสมมติว่าไม่มีค่าที่ถูกต้องอีกต่อไปและจะมีหลายแถวในตารางฉันจะเข้ารหัสค่าที่เป็นไปได้ในสิ่งที่เล็กกว่าและเร็วกว่า varchar ()
Wikser

คำตอบ:


130

คุณได้ดูการเพิ่มcheck constraintคอลัมน์ซึ่งจะ จำกัด ค่าหรือไม่? สิ่งที่ต้องการ:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)

2
ขอบคุณ - มันใช้งานได้ดี การเปลี่ยนแปลงเล็ก ๆ อย่างหนึ่งที่ฉันต้องทำคือ "ความถี่ใน .... " ต้องอยู่ในวงเล็บด้วย สตูดิโอเซิร์ฟเวอร์ SQL ไม่ชอบโดยไม่มีเหตุผลบางประการ
อดัม

1
การตรวจสอบข้อ จำกัด นี้มีความละเอียดอ่อนหรือไม่
RWendi

3
ฉันคิดว่าคุณพลาดโคม่าหลังจากบรรทัดที่ 4Frequency varchar(200)
BillOverFlow

RWendi - การเปรียบเทียบ SQL Server เริ่มต้นนั้นไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ซึ่งใช้กับระดับฐานข้อมูล ดูข้อมูลเพิ่มเติมได้ที่นี่stackoverflow.com/questions/1439485/…
jwoe

57

คุณต้องการจำกัด การตรวจสอบ

ข้อ จำกัด CHECK กำหนดค่าที่ถูกต้องจากนิพจน์ตรรกะที่ไม่ได้ขึ้นอยู่กับข้อมูลในคอลัมน์อื่น ตัวอย่างเช่นช่วงของค่าสำหรับคอลัมน์เงินเดือนสามารถ จำกัด ได้โดยการสร้างข้อ จำกัด CHECK ที่อนุญาตเฉพาะข้อมูลที่มีตั้งแต่ 15,000 ถึง 100,000 เหรียญ ซึ่งจะป้องกันไม่ให้เงินเดือนเข้าเกินช่วงเงินเดือนปกติ

คุณต้องการสิ่งที่ชอบ:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))

คุณยังสามารถใช้ข้อ จำกัด การตรวจสอบกับฟังก์ชันสเกลาร์ตามที่อธิบายไว้ในลิงก์ด้านบนซึ่งเป็นวิธีที่ฉันต้องการทำ


1
คำตอบนี้ก็ดีเหมือนกัน .. ทำไมเรารับมากกว่าหนึ่งไม่ได้ !! :)
อดัม

1
ใช่อันนี้ดีกว่า :) +1 สำหรับสิ่งนั้น
Owais Qureshi

12

โดยส่วนตัวฉันจะเขียนโค้ดว่า tinyint และ:

  • อย่างใดอย่างหนึ่ง: เปลี่ยนเป็นข้อความบนไคลเอนต์ตรวจสอบข้อ จำกัด ระหว่าง 1 ถึง 4
  • หรือ: ใช้ตารางการค้นหาที่มีคีย์ต่างประเทศ

เหตุผล:

  • จะใช้เวลาโดยเฉลี่ย 8 ไบต์ในการจัดเก็บข้อความ 1 ไบต์สำหรับ Tinyint มากกว่าหลายล้านแถวสิ่งนี้จะสร้างความแตกต่าง

  • แล้วการเรียงลำดับล่ะ? "รายวัน" เหมือนกับ "DAILY" หรือไม่ ต้องใช้ทรัพยากรในการเปรียบเทียบแบบนี้

  • สุดท้ายถ้าคุณต้องการเพิ่ม "รายปักษ์" หรือ "รายชั่วโมง" ล่ะ? สิ่งนี้ต้องมีการเปลี่ยนแปลงสคีมาเมื่อคุณสามารถเพิ่มแถวใหม่ในตารางการค้นหาได้


5

เมื่อคุณกำลังแก้ไขตาราง
คลิกขวา -> ตรวจสอบข้อ จำกัด -> เพิ่ม -> พิมพ์บางอย่างเช่นFrequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')ในฟิลด์นิพจน์และชื่อข้อ จำกัด ที่ดีในฟิลด์ (ชื่อ)
คุณทำเสร็จแล้ว

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