Varchar () sütunu belirli değerlerle kısıtlansın mı?


96

Örneğin MS SQL Server 2008'de bir varchar sütunu için 4 farklı değer belirtmenin bir yolu var mı?

Örneğin, olası değerler olarak yalnızca "Günlük", "Haftalık", "Aylık", "Yıllık" kabul eden Sıklık (varchar) adlı bir sütuna ihtiyacım var

Bu, tabloyu oluştururken SQL Server Management Studio içinde ayarlanabilir mi?


5
Daha fazla geçerli değer olmayacağını varsaymak güvenli ise ve tabloda çok sayıda satır olacaksa, olası değerleri varchar () 'dan daha küçük ve daha hızlı bir şekilde kodlardım.
Wikser

Yanıtlar:


130

Bu check constraintsütuna değerleri kısıtlayacak bir eklemeye zaten baktınız mı ? Gibi bir şey:

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

2
Teşekkürler - bu harika çalıştı. Yine de yapmam gereken küçük bir değişiklik, "Frekans GİRİŞİ ...." nin de parantez içine alınması gerektiğiydi. SQL server stüdyosu nedense onu beğenmedi.
Adam

1
Bu kısıtlama kontrolü büyük / küçük harfe duyarlı mı?
RWendi

3
4. satırdan sonra komayı kaçırdığınızı düşünüyorumFrequency varchar(200)
BillOverFlow

RWendi - varsayılan SQL Server harmanlaması büyük / küçük harf duyarlıdır ve veritabanı düzeyinde geçerlidir. Daha fazla bilgi burada stackoverflow.com/questions/1439485/…
jwoe

57

Bir kontrol kısıtlaması istiyorsunuz .

CHECK kısıtlamaları, başka bir sütundaki verilere dayalı olmayan bir mantıksal ifadeden geçerli değerleri belirler. Örneğin, bir maaş sütununun değer aralığı, yalnızca 15.000 ABD Doları ile 100.000 ABD Doları arasında değişen verilere izin veren bir KONTROL kısıtlaması oluşturularak sınırlandırılabilir. Bu, maaşların normal maaş aralığının dışında girilmesini önler.

Şunun gibi bir şey istiyorsun:

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

Yukarıdaki bağlantıda açıklandığı gibi, skaler işlevlerle kontrol kısıtlamalarını da uygulayabilirsiniz, ben de bunu yapmayı tercih ederim.


1
bu cevap da iyiydi .. neden birden fazlasını kabul edemiyoruz !! :)
Adam

1
Evet, bu daha iyi :), bunun için +1
Owais Qureshi

12

Şahsen, onu tinyint olarak kodlardım ve:

  • Ya: istemcideki metne değiştirin, 1 ile 4 arasındaki kısıtlamayı kontrol edin
  • Veya: yabancı anahtar içeren bir arama tablosu kullanın

Sebepler:

  • Metni depolamak ortalama 8 bayt, tinyint için 1 bayt alır. Milyonlarca satırın üzerinde, bu bir fark yaratacaktır.

  • Harmanlama ne olacak? "Günlük" ile "DAILY" aynı mıdır? Bu tür bir karşılaştırma yapmak için kaynaklar gerekir.

  • Son olarak, "İki Haftada Bir" veya "Saatte Bir" eklemek isterseniz ne olur? Bu, bir arama tablosuna yeni satırlar ekleyebileceğiniz zaman bir şema değişikliği gerektirir.


5

Bir tabloyu düzenlerken
Sağ Tık -> Sınırlamaları Kontrol Et -> Ekle -> Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')İfade alanına benzer bir şey ve (Ad) alanına iyi bir kısıtlama adı yazın.
Bitirdiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.